mirror of
				https://github.com/prometheus/node_exporter.git
				synced 2025-08-20 18:33:52 -07:00 
			
		
		
		
	Update vendor/
Signed-off-by: Ben Kochie <superq@gmail.com>
This commit is contained in:
		
							parent
							
								
									a582b3335a
								
							
						
					
					
						commit
						cdb9e7d2b8
					
				
							
								
								
									
										5
									
								
								vendor/github.com/BurntSushi/toml/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/BurntSushi/toml/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
TAGS
 | 
			
		||||
tags
 | 
			
		||||
.*.swp
 | 
			
		||||
tomlcheck/tomlcheck
 | 
			
		||||
toml.test
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/BurntSushi/toml/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/BurntSushi/toml/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - 1.1
 | 
			
		||||
  - 1.2
 | 
			
		||||
  - 1.3
 | 
			
		||||
  - 1.4
 | 
			
		||||
  - 1.5
 | 
			
		||||
  - 1.6
 | 
			
		||||
  - tip
 | 
			
		||||
install:
 | 
			
		||||
  - go install ./...
 | 
			
		||||
  - go get github.com/BurntSushi/toml-test
 | 
			
		||||
script:
 | 
			
		||||
  - export PATH="$PATH:$HOME/gopath/bin"
 | 
			
		||||
  - make test
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/BurntSushi/toml/COMPATIBLE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/BurntSushi/toml/COMPATIBLE
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
Compatible with TOML version
 | 
			
		||||
[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/BurntSushi/toml/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/BurntSushi/toml/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,19 +0,0 @@
 | 
			
		|||
install:
 | 
			
		||||
	go install ./...
 | 
			
		||||
 | 
			
		||||
test: install
 | 
			
		||||
	go test -v
 | 
			
		||||
	toml-test toml-test-decoder
 | 
			
		||||
	toml-test -encoder toml-test-encoder
 | 
			
		||||
 | 
			
		||||
fmt:
 | 
			
		||||
	gofmt -w *.go */*.go
 | 
			
		||||
	colcheck *.go */*.go
 | 
			
		||||
 | 
			
		||||
tags:
 | 
			
		||||
	find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS
 | 
			
		||||
 | 
			
		||||
push:
 | 
			
		||||
	git push origin master
 | 
			
		||||
	git push github master
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										218
									
								
								vendor/github.com/BurntSushi/toml/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										218
									
								
								vendor/github.com/BurntSushi/toml/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,218 +0,0 @@
 | 
			
		|||
## TOML parser and encoder for Go with reflection
 | 
			
		||||
 | 
			
		||||
TOML stands for Tom's Obvious, Minimal Language. This Go package provides a
 | 
			
		||||
reflection interface similar to Go's standard library `json` and `xml`
 | 
			
		||||
packages. This package also supports the `encoding.TextUnmarshaler` and
 | 
			
		||||
`encoding.TextMarshaler` interfaces so that you can define custom data
 | 
			
		||||
representations. (There is an example of this below.)
 | 
			
		||||
 | 
			
		||||
Spec: https://github.com/toml-lang/toml
 | 
			
		||||
 | 
			
		||||
Compatible with TOML version
 | 
			
		||||
[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)
 | 
			
		||||
 | 
			
		||||
Documentation: https://godoc.org/github.com/BurntSushi/toml
 | 
			
		||||
 | 
			
		||||
Installation:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
go get github.com/BurntSushi/toml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Try the toml validator:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
go get github.com/BurntSushi/toml/cmd/tomlv
 | 
			
		||||
tomlv some-toml-file.toml
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
[](https://travis-ci.org/BurntSushi/toml) [](https://godoc.org/github.com/BurntSushi/toml)
 | 
			
		||||
 | 
			
		||||
### Testing
 | 
			
		||||
 | 
			
		||||
This package passes all tests in
 | 
			
		||||
[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder
 | 
			
		||||
and the encoder.
 | 
			
		||||
 | 
			
		||||
### Examples
 | 
			
		||||
 | 
			
		||||
This package works similarly to how the Go standard library handles `XML`
 | 
			
		||||
and `JSON`. Namely, data is loaded into Go values via reflection.
 | 
			
		||||
 | 
			
		||||
For the simplest example, consider some TOML file as just a list of keys
 | 
			
		||||
and values:
 | 
			
		||||
 | 
			
		||||
```toml
 | 
			
		||||
Age = 25
 | 
			
		||||
Cats = [ "Cauchy", "Plato" ]
 | 
			
		||||
Pi = 3.14
 | 
			
		||||
Perfection = [ 6, 28, 496, 8128 ]
 | 
			
		||||
DOB = 1987-07-05T05:45:00Z
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Which could be defined in Go as:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
type Config struct {
 | 
			
		||||
  Age int
 | 
			
		||||
  Cats []string
 | 
			
		||||
  Pi float64
 | 
			
		||||
  Perfection []int
 | 
			
		||||
  DOB time.Time // requires `import time`
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
And then decoded with:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
var conf Config
 | 
			
		||||
if _, err := toml.Decode(tomlData, &conf); err != nil {
 | 
			
		||||
  // handle error
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can also use struct tags if your struct field name doesn't map to a TOML
 | 
			
		||||
key value directly:
 | 
			
		||||
 | 
			
		||||
```toml
 | 
			
		||||
some_key_NAME = "wat"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
type TOML struct {
 | 
			
		||||
  ObscureKey string `toml:"some_key_NAME"`
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Using the `encoding.TextUnmarshaler` interface
 | 
			
		||||
 | 
			
		||||
Here's an example that automatically parses duration strings into
 | 
			
		||||
`time.Duration` values:
 | 
			
		||||
 | 
			
		||||
```toml
 | 
			
		||||
[[song]]
 | 
			
		||||
name = "Thunder Road"
 | 
			
		||||
duration = "4m49s"
 | 
			
		||||
 | 
			
		||||
[[song]]
 | 
			
		||||
name = "Stairway to Heaven"
 | 
			
		||||
duration = "8m03s"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Which can be decoded with:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
type song struct {
 | 
			
		||||
  Name     string
 | 
			
		||||
  Duration duration
 | 
			
		||||
}
 | 
			
		||||
type songs struct {
 | 
			
		||||
  Song []song
 | 
			
		||||
}
 | 
			
		||||
var favorites songs
 | 
			
		||||
if _, err := toml.Decode(blob, &favorites); err != nil {
 | 
			
		||||
  log.Fatal(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for _, s := range favorites.Song {
 | 
			
		||||
  fmt.Printf("%s (%s)\n", s.Name, s.Duration)
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
And you'll also need a `duration` type that satisfies the
 | 
			
		||||
`encoding.TextUnmarshaler` interface:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
type duration struct {
 | 
			
		||||
	time.Duration
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *duration) UnmarshalText(text []byte) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	d.Duration, err = time.ParseDuration(string(text))
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### More complex usage
 | 
			
		||||
 | 
			
		||||
Here's an example of how to load the example from the official spec page:
 | 
			
		||||
 | 
			
		||||
```toml
 | 
			
		||||
# This is a TOML document. Boom.
 | 
			
		||||
 | 
			
		||||
title = "TOML Example"
 | 
			
		||||
 | 
			
		||||
[owner]
 | 
			
		||||
name = "Tom Preston-Werner"
 | 
			
		||||
organization = "GitHub"
 | 
			
		||||
bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
 | 
			
		||||
dob = 1979-05-27T07:32:00Z # First class dates? Why not?
 | 
			
		||||
 | 
			
		||||
[database]
 | 
			
		||||
server = "192.168.1.1"
 | 
			
		||||
ports = [ 8001, 8001, 8002 ]
 | 
			
		||||
connection_max = 5000
 | 
			
		||||
enabled = true
 | 
			
		||||
 | 
			
		||||
[servers]
 | 
			
		||||
 | 
			
		||||
  # You can indent as you please. Tabs or spaces. TOML don't care.
 | 
			
		||||
  [servers.alpha]
 | 
			
		||||
  ip = "10.0.0.1"
 | 
			
		||||
  dc = "eqdc10"
 | 
			
		||||
 | 
			
		||||
  [servers.beta]
 | 
			
		||||
  ip = "10.0.0.2"
 | 
			
		||||
  dc = "eqdc10"
 | 
			
		||||
 | 
			
		||||
[clients]
 | 
			
		||||
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
 | 
			
		||||
 | 
			
		||||
# Line breaks are OK when inside arrays
 | 
			
		||||
hosts = [
 | 
			
		||||
  "alpha",
 | 
			
		||||
  "omega"
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
And the corresponding Go types are:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
type tomlConfig struct {
 | 
			
		||||
	Title string
 | 
			
		||||
	Owner ownerInfo
 | 
			
		||||
	DB database `toml:"database"`
 | 
			
		||||
	Servers map[string]server
 | 
			
		||||
	Clients clients
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ownerInfo struct {
 | 
			
		||||
	Name string
 | 
			
		||||
	Org string `toml:"organization"`
 | 
			
		||||
	Bio string
 | 
			
		||||
	DOB time.Time
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type database struct {
 | 
			
		||||
	Server string
 | 
			
		||||
	Ports []int
 | 
			
		||||
	ConnMax int `toml:"connection_max"`
 | 
			
		||||
	Enabled bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type server struct {
 | 
			
		||||
	IP string
 | 
			
		||||
	DC string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type clients struct {
 | 
			
		||||
	Data [][]interface{}
 | 
			
		||||
	Hosts []string
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Note that a case insensitive match will be tried if an exact match can't be
 | 
			
		||||
found.
 | 
			
		||||
 | 
			
		||||
A working example of the above can be found in `_examples/example.{go,toml}`.
 | 
			
		||||
							
								
								
									
										509
									
								
								vendor/github.com/BurntSushi/toml/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										509
									
								
								vendor/github.com/BurntSushi/toml/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,509 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"math"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func e(format string, args ...interface{}) error {
 | 
			
		||||
	return fmt.Errorf("toml: "+format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshaler is the interface implemented by objects that can unmarshal a
 | 
			
		||||
// TOML description of themselves.
 | 
			
		||||
type Unmarshaler interface {
 | 
			
		||||
	UnmarshalTOML(interface{}) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`.
 | 
			
		||||
func Unmarshal(p []byte, v interface{}) error {
 | 
			
		||||
	_, err := Decode(string(p), v)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Primitive is a TOML value that hasn't been decoded into a Go value.
 | 
			
		||||
// When using the various `Decode*` functions, the type `Primitive` may
 | 
			
		||||
// be given to any value, and its decoding will be delayed.
 | 
			
		||||
//
 | 
			
		||||
// A `Primitive` value can be decoded using the `PrimitiveDecode` function.
 | 
			
		||||
//
 | 
			
		||||
// The underlying representation of a `Primitive` value is subject to change.
 | 
			
		||||
// Do not rely on it.
 | 
			
		||||
//
 | 
			
		||||
// N.B. Primitive values are still parsed, so using them will only avoid
 | 
			
		||||
// the overhead of reflection. They can be useful when you don't know the
 | 
			
		||||
// exact type of TOML data until run time.
 | 
			
		||||
type Primitive struct {
 | 
			
		||||
	undecoded interface{}
 | 
			
		||||
	context   Key
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DEPRECATED!
 | 
			
		||||
//
 | 
			
		||||
// Use MetaData.PrimitiveDecode instead.
 | 
			
		||||
func PrimitiveDecode(primValue Primitive, v interface{}) error {
 | 
			
		||||
	md := MetaData{decoded: make(map[string]bool)}
 | 
			
		||||
	return md.unify(primValue.undecoded, rvalue(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PrimitiveDecode is just like the other `Decode*` functions, except it
 | 
			
		||||
// decodes a TOML value that has already been parsed. Valid primitive values
 | 
			
		||||
// can *only* be obtained from values filled by the decoder functions,
 | 
			
		||||
// including this method. (i.e., `v` may contain more `Primitive`
 | 
			
		||||
// values.)
 | 
			
		||||
//
 | 
			
		||||
// Meta data for primitive values is included in the meta data returned by
 | 
			
		||||
// the `Decode*` functions with one exception: keys returned by the Undecoded
 | 
			
		||||
// method will only reflect keys that were decoded. Namely, any keys hidden
 | 
			
		||||
// behind a Primitive will be considered undecoded. Executing this method will
 | 
			
		||||
// update the undecoded keys in the meta data. (See the example.)
 | 
			
		||||
func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
 | 
			
		||||
	md.context = primValue.context
 | 
			
		||||
	defer func() { md.context = nil }()
 | 
			
		||||
	return md.unify(primValue.undecoded, rvalue(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Decode will decode the contents of `data` in TOML format into a pointer
 | 
			
		||||
// `v`.
 | 
			
		||||
//
 | 
			
		||||
// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be
 | 
			
		||||
// used interchangeably.)
 | 
			
		||||
//
 | 
			
		||||
// TOML arrays of tables correspond to either a slice of structs or a slice
 | 
			
		||||
// of maps.
 | 
			
		||||
//
 | 
			
		||||
// TOML datetimes correspond to Go `time.Time` values.
 | 
			
		||||
//
 | 
			
		||||
// All other TOML types (float, string, int, bool and array) correspond
 | 
			
		||||
// to the obvious Go types.
 | 
			
		||||
//
 | 
			
		||||
// An exception to the above rules is if a type implements the
 | 
			
		||||
// encoding.TextUnmarshaler interface. In this case, any primitive TOML value
 | 
			
		||||
// (floats, strings, integers, booleans and datetimes) will be converted to
 | 
			
		||||
// a byte string and given to the value's UnmarshalText method. See the
 | 
			
		||||
// Unmarshaler example for a demonstration with time duration strings.
 | 
			
		||||
//
 | 
			
		||||
// Key mapping
 | 
			
		||||
//
 | 
			
		||||
// TOML keys can map to either keys in a Go map or field names in a Go
 | 
			
		||||
// struct. The special `toml` struct tag may be used to map TOML keys to
 | 
			
		||||
// struct fields that don't match the key name exactly. (See the example.)
 | 
			
		||||
// A case insensitive match to struct names will be tried if an exact match
 | 
			
		||||
// can't be found.
 | 
			
		||||
//
 | 
			
		||||
// The mapping between TOML values and Go values is loose. That is, there
 | 
			
		||||
// may exist TOML values that cannot be placed into your representation, and
 | 
			
		||||
// there may be parts of your representation that do not correspond to
 | 
			
		||||
// TOML values. This loose mapping can be made stricter by using the IsDefined
 | 
			
		||||
// and/or Undecoded methods on the MetaData returned.
 | 
			
		||||
//
 | 
			
		||||
// This decoder will not handle cyclic types. If a cyclic type is passed,
 | 
			
		||||
// `Decode` will not terminate.
 | 
			
		||||
func Decode(data string, v interface{}) (MetaData, error) {
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if rv.Kind() != reflect.Ptr {
 | 
			
		||||
		return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v))
 | 
			
		||||
	}
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v))
 | 
			
		||||
	}
 | 
			
		||||
	p, err := parse(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return MetaData{}, err
 | 
			
		||||
	}
 | 
			
		||||
	md := MetaData{
 | 
			
		||||
		p.mapping, p.types, p.ordered,
 | 
			
		||||
		make(map[string]bool, len(p.ordered)), nil,
 | 
			
		||||
	}
 | 
			
		||||
	return md, md.unify(p.mapping, indirect(rv))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeFile is just like Decode, except it will automatically read the
 | 
			
		||||
// contents of the file at `fpath` and decode it for you.
 | 
			
		||||
func DecodeFile(fpath string, v interface{}) (MetaData, error) {
 | 
			
		||||
	bs, err := ioutil.ReadFile(fpath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return MetaData{}, err
 | 
			
		||||
	}
 | 
			
		||||
	return Decode(string(bs), v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeReader is just like Decode, except it will consume all bytes
 | 
			
		||||
// from the reader and decode it for you.
 | 
			
		||||
func DecodeReader(r io.Reader, v interface{}) (MetaData, error) {
 | 
			
		||||
	bs, err := ioutil.ReadAll(r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return MetaData{}, err
 | 
			
		||||
	}
 | 
			
		||||
	return Decode(string(bs), v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// unify performs a sort of type unification based on the structure of `rv`,
 | 
			
		||||
// which is the client representation.
 | 
			
		||||
//
 | 
			
		||||
// Any type mismatch produces an error. Finding a type that we don't know
 | 
			
		||||
// how to handle produces an unsupported type error.
 | 
			
		||||
func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
 | 
			
		||||
 | 
			
		||||
	// Special case. Look for a `Primitive` value.
 | 
			
		||||
	if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() {
 | 
			
		||||
		// Save the undecoded data and the key context into the primitive
 | 
			
		||||
		// value.
 | 
			
		||||
		context := make(Key, len(md.context))
 | 
			
		||||
		copy(context, md.context)
 | 
			
		||||
		rv.Set(reflect.ValueOf(Primitive{
 | 
			
		||||
			undecoded: data,
 | 
			
		||||
			context:   context,
 | 
			
		||||
		}))
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Special case. Unmarshaler Interface support.
 | 
			
		||||
	if rv.CanAddr() {
 | 
			
		||||
		if v, ok := rv.Addr().Interface().(Unmarshaler); ok {
 | 
			
		||||
			return v.UnmarshalTOML(data)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Special case. Handle time.Time values specifically.
 | 
			
		||||
	// TODO: Remove this code when we decide to drop support for Go 1.1.
 | 
			
		||||
	// This isn't necessary in Go 1.2 because time.Time satisfies the encoding
 | 
			
		||||
	// interfaces.
 | 
			
		||||
	if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) {
 | 
			
		||||
		return md.unifyDatetime(data, rv)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Special case. Look for a value satisfying the TextUnmarshaler interface.
 | 
			
		||||
	if v, ok := rv.Interface().(TextUnmarshaler); ok {
 | 
			
		||||
		return md.unifyText(data, v)
 | 
			
		||||
	}
 | 
			
		||||
	// BUG(burntsushi)
 | 
			
		||||
	// The behavior here is incorrect whenever a Go type satisfies the
 | 
			
		||||
	// encoding.TextUnmarshaler interface but also corresponds to a TOML
 | 
			
		||||
	// hash or array. In particular, the unmarshaler should only be applied
 | 
			
		||||
	// to primitive TOML values. But at this point, it will be applied to
 | 
			
		||||
	// all kinds of values and produce an incorrect error whenever those values
 | 
			
		||||
	// are hashes or arrays (including arrays of tables).
 | 
			
		||||
 | 
			
		||||
	k := rv.Kind()
 | 
			
		||||
 | 
			
		||||
	// laziness
 | 
			
		||||
	if k >= reflect.Int && k <= reflect.Uint64 {
 | 
			
		||||
		return md.unifyInt(data, rv)
 | 
			
		||||
	}
 | 
			
		||||
	switch k {
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		elem := reflect.New(rv.Type().Elem())
 | 
			
		||||
		err := md.unify(data, reflect.Indirect(elem))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		rv.Set(elem)
 | 
			
		||||
		return nil
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		return md.unifyStruct(data, rv)
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		return md.unifyMap(data, rv)
 | 
			
		||||
	case reflect.Array:
 | 
			
		||||
		return md.unifyArray(data, rv)
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		return md.unifySlice(data, rv)
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		return md.unifyString(data, rv)
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		return md.unifyBool(data, rv)
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		// we only support empty interfaces.
 | 
			
		||||
		if rv.NumMethod() > 0 {
 | 
			
		||||
			return e("unsupported type %s", rv.Type())
 | 
			
		||||
		}
 | 
			
		||||
		return md.unifyAnything(data, rv)
 | 
			
		||||
	case reflect.Float32:
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case reflect.Float64:
 | 
			
		||||
		return md.unifyFloat64(data, rv)
 | 
			
		||||
	}
 | 
			
		||||
	return e("unsupported type %s", rv.Kind())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
 | 
			
		||||
	tmap, ok := mapping.(map[string]interface{})
 | 
			
		||||
	if !ok {
 | 
			
		||||
		if mapping == nil {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return e("type mismatch for %s: expected table but found %T",
 | 
			
		||||
			rv.Type().String(), mapping)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for key, datum := range tmap {
 | 
			
		||||
		var f *field
 | 
			
		||||
		fields := cachedTypeFields(rv.Type())
 | 
			
		||||
		for i := range fields {
 | 
			
		||||
			ff := &fields[i]
 | 
			
		||||
			if ff.name == key {
 | 
			
		||||
				f = ff
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			if f == nil && strings.EqualFold(ff.name, key) {
 | 
			
		||||
				f = ff
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if f != nil {
 | 
			
		||||
			subv := rv
 | 
			
		||||
			for _, i := range f.index {
 | 
			
		||||
				subv = indirect(subv.Field(i))
 | 
			
		||||
			}
 | 
			
		||||
			if isUnifiable(subv) {
 | 
			
		||||
				md.decoded[md.context.add(key).String()] = true
 | 
			
		||||
				md.context = append(md.context, key)
 | 
			
		||||
				if err := md.unify(datum, subv); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				md.context = md.context[0 : len(md.context)-1]
 | 
			
		||||
			} else if f.name != "" {
 | 
			
		||||
				// Bad user! No soup for you!
 | 
			
		||||
				return e("cannot write unexported field %s.%s",
 | 
			
		||||
					rv.Type().String(), f.name)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
 | 
			
		||||
	tmap, ok := mapping.(map[string]interface{})
 | 
			
		||||
	if !ok {
 | 
			
		||||
		if tmap == nil {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return badtype("map", mapping)
 | 
			
		||||
	}
 | 
			
		||||
	if rv.IsNil() {
 | 
			
		||||
		rv.Set(reflect.MakeMap(rv.Type()))
 | 
			
		||||
	}
 | 
			
		||||
	for k, v := range tmap {
 | 
			
		||||
		md.decoded[md.context.add(k).String()] = true
 | 
			
		||||
		md.context = append(md.context, k)
 | 
			
		||||
 | 
			
		||||
		rvkey := indirect(reflect.New(rv.Type().Key()))
 | 
			
		||||
		rvval := reflect.Indirect(reflect.New(rv.Type().Elem()))
 | 
			
		||||
		if err := md.unify(v, rvval); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		md.context = md.context[0 : len(md.context)-1]
 | 
			
		||||
 | 
			
		||||
		rvkey.SetString(k)
 | 
			
		||||
		rv.SetMapIndex(rvkey, rvval)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	datav := reflect.ValueOf(data)
 | 
			
		||||
	if datav.Kind() != reflect.Slice {
 | 
			
		||||
		if !datav.IsValid() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return badtype("slice", data)
 | 
			
		||||
	}
 | 
			
		||||
	sliceLen := datav.Len()
 | 
			
		||||
	if sliceLen != rv.Len() {
 | 
			
		||||
		return e("expected array length %d; got TOML array of length %d",
 | 
			
		||||
			rv.Len(), sliceLen)
 | 
			
		||||
	}
 | 
			
		||||
	return md.unifySliceArray(datav, rv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	datav := reflect.ValueOf(data)
 | 
			
		||||
	if datav.Kind() != reflect.Slice {
 | 
			
		||||
		if !datav.IsValid() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return badtype("slice", data)
 | 
			
		||||
	}
 | 
			
		||||
	n := datav.Len()
 | 
			
		||||
	if rv.IsNil() || rv.Cap() < n {
 | 
			
		||||
		rv.Set(reflect.MakeSlice(rv.Type(), n, n))
 | 
			
		||||
	}
 | 
			
		||||
	rv.SetLen(n)
 | 
			
		||||
	return md.unifySliceArray(datav, rv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifySliceArray(data, rv reflect.Value) error {
 | 
			
		||||
	sliceLen := data.Len()
 | 
			
		||||
	for i := 0; i < sliceLen; i++ {
 | 
			
		||||
		v := data.Index(i).Interface()
 | 
			
		||||
		sliceval := indirect(rv.Index(i))
 | 
			
		||||
		if err := md.unify(v, sliceval); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	if _, ok := data.(time.Time); ok {
 | 
			
		||||
		rv.Set(reflect.ValueOf(data))
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return badtype("time.Time", data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	if s, ok := data.(string); ok {
 | 
			
		||||
		rv.SetString(s)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return badtype("string", data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	if num, ok := data.(float64); ok {
 | 
			
		||||
		switch rv.Kind() {
 | 
			
		||||
		case reflect.Float32:
 | 
			
		||||
			fallthrough
 | 
			
		||||
		case reflect.Float64:
 | 
			
		||||
			rv.SetFloat(num)
 | 
			
		||||
		default:
 | 
			
		||||
			panic("bug")
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return badtype("float", data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	if num, ok := data.(int64); ok {
 | 
			
		||||
		if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 {
 | 
			
		||||
			switch rv.Kind() {
 | 
			
		||||
			case reflect.Int, reflect.Int64:
 | 
			
		||||
				// No bounds checking necessary.
 | 
			
		||||
			case reflect.Int8:
 | 
			
		||||
				if num < math.MinInt8 || num > math.MaxInt8 {
 | 
			
		||||
					return e("value %d is out of range for int8", num)
 | 
			
		||||
				}
 | 
			
		||||
			case reflect.Int16:
 | 
			
		||||
				if num < math.MinInt16 || num > math.MaxInt16 {
 | 
			
		||||
					return e("value %d is out of range for int16", num)
 | 
			
		||||
				}
 | 
			
		||||
			case reflect.Int32:
 | 
			
		||||
				if num < math.MinInt32 || num > math.MaxInt32 {
 | 
			
		||||
					return e("value %d is out of range for int32", num)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			rv.SetInt(num)
 | 
			
		||||
		} else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 {
 | 
			
		||||
			unum := uint64(num)
 | 
			
		||||
			switch rv.Kind() {
 | 
			
		||||
			case reflect.Uint, reflect.Uint64:
 | 
			
		||||
				// No bounds checking necessary.
 | 
			
		||||
			case reflect.Uint8:
 | 
			
		||||
				if num < 0 || unum > math.MaxUint8 {
 | 
			
		||||
					return e("value %d is out of range for uint8", num)
 | 
			
		||||
				}
 | 
			
		||||
			case reflect.Uint16:
 | 
			
		||||
				if num < 0 || unum > math.MaxUint16 {
 | 
			
		||||
					return e("value %d is out of range for uint16", num)
 | 
			
		||||
				}
 | 
			
		||||
			case reflect.Uint32:
 | 
			
		||||
				if num < 0 || unum > math.MaxUint32 {
 | 
			
		||||
					return e("value %d is out of range for uint32", num)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			rv.SetUint(unum)
 | 
			
		||||
		} else {
 | 
			
		||||
			panic("unreachable")
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return badtype("integer", data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	if b, ok := data.(bool); ok {
 | 
			
		||||
		rv.SetBool(b)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return badtype("boolean", data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error {
 | 
			
		||||
	rv.Set(reflect.ValueOf(data))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error {
 | 
			
		||||
	var s string
 | 
			
		||||
	switch sdata := data.(type) {
 | 
			
		||||
	case TextMarshaler:
 | 
			
		||||
		text, err := sdata.MarshalText()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		s = string(text)
 | 
			
		||||
	case fmt.Stringer:
 | 
			
		||||
		s = sdata.String()
 | 
			
		||||
	case string:
 | 
			
		||||
		s = sdata
 | 
			
		||||
	case bool:
 | 
			
		||||
		s = fmt.Sprintf("%v", sdata)
 | 
			
		||||
	case int64:
 | 
			
		||||
		s = fmt.Sprintf("%d", sdata)
 | 
			
		||||
	case float64:
 | 
			
		||||
		s = fmt.Sprintf("%f", sdata)
 | 
			
		||||
	default:
 | 
			
		||||
		return badtype("primitive (string-like)", data)
 | 
			
		||||
	}
 | 
			
		||||
	if err := v.UnmarshalText([]byte(s)); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// rvalue returns a reflect.Value of `v`. All pointers are resolved.
 | 
			
		||||
func rvalue(v interface{}) reflect.Value {
 | 
			
		||||
	return indirect(reflect.ValueOf(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// indirect returns the value pointed to by a pointer.
 | 
			
		||||
// Pointers are followed until the value is not a pointer.
 | 
			
		||||
// New values are allocated for each nil pointer.
 | 
			
		||||
//
 | 
			
		||||
// An exception to this rule is if the value satisfies an interface of
 | 
			
		||||
// interest to us (like encoding.TextUnmarshaler).
 | 
			
		||||
func indirect(v reflect.Value) reflect.Value {
 | 
			
		||||
	if v.Kind() != reflect.Ptr {
 | 
			
		||||
		if v.CanSet() {
 | 
			
		||||
			pv := v.Addr()
 | 
			
		||||
			if _, ok := pv.Interface().(TextUnmarshaler); ok {
 | 
			
		||||
				return pv
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return v
 | 
			
		||||
	}
 | 
			
		||||
	if v.IsNil() {
 | 
			
		||||
		v.Set(reflect.New(v.Type().Elem()))
 | 
			
		||||
	}
 | 
			
		||||
	return indirect(reflect.Indirect(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isUnifiable(rv reflect.Value) bool {
 | 
			
		||||
	if rv.CanSet() {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := rv.Interface().(TextUnmarshaler); ok {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func badtype(expected string, data interface{}) error {
 | 
			
		||||
	return e("cannot load TOML value of type %T into a Go %s", data, expected)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										121
									
								
								vendor/github.com/BurntSushi/toml/decode_meta.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										121
									
								
								vendor/github.com/BurntSushi/toml/decode_meta.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,121 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
import "strings"
 | 
			
		||||
 | 
			
		||||
// MetaData allows access to meta information about TOML data that may not
 | 
			
		||||
// be inferrable via reflection. In particular, whether a key has been defined
 | 
			
		||||
// and the TOML type of a key.
 | 
			
		||||
type MetaData struct {
 | 
			
		||||
	mapping map[string]interface{}
 | 
			
		||||
	types   map[string]tomlType
 | 
			
		||||
	keys    []Key
 | 
			
		||||
	decoded map[string]bool
 | 
			
		||||
	context Key // Used only during decoding.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsDefined returns true if the key given exists in the TOML data. The key
 | 
			
		||||
// should be specified hierarchially. e.g.,
 | 
			
		||||
//
 | 
			
		||||
//	// access the TOML key 'a.b.c'
 | 
			
		||||
//	IsDefined("a", "b", "c")
 | 
			
		||||
//
 | 
			
		||||
// IsDefined will return false if an empty key given. Keys are case sensitive.
 | 
			
		||||
func (md *MetaData) IsDefined(key ...string) bool {
 | 
			
		||||
	if len(key) == 0 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var hash map[string]interface{}
 | 
			
		||||
	var ok bool
 | 
			
		||||
	var hashOrVal interface{} = md.mapping
 | 
			
		||||
	for _, k := range key {
 | 
			
		||||
		if hash, ok = hashOrVal.(map[string]interface{}); !ok {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		if hashOrVal, ok = hash[k]; !ok {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Type returns a string representation of the type of the key specified.
 | 
			
		||||
//
 | 
			
		||||
// Type will return the empty string if given an empty key or a key that
 | 
			
		||||
// does not exist. Keys are case sensitive.
 | 
			
		||||
func (md *MetaData) Type(key ...string) string {
 | 
			
		||||
	fullkey := strings.Join(key, ".")
 | 
			
		||||
	if typ, ok := md.types[fullkey]; ok {
 | 
			
		||||
		return typ.typeString()
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Key is the type of any TOML key, including key groups. Use (MetaData).Keys
 | 
			
		||||
// to get values of this type.
 | 
			
		||||
type Key []string
 | 
			
		||||
 | 
			
		||||
func (k Key) String() string {
 | 
			
		||||
	return strings.Join(k, ".")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Key) maybeQuotedAll() string {
 | 
			
		||||
	var ss []string
 | 
			
		||||
	for i := range k {
 | 
			
		||||
		ss = append(ss, k.maybeQuoted(i))
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(ss, ".")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Key) maybeQuoted(i int) string {
 | 
			
		||||
	quote := false
 | 
			
		||||
	for _, c := range k[i] {
 | 
			
		||||
		if !isBareKeyChar(c) {
 | 
			
		||||
			quote = true
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if quote {
 | 
			
		||||
		return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\""
 | 
			
		||||
	}
 | 
			
		||||
	return k[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k Key) add(piece string) Key {
 | 
			
		||||
	newKey := make(Key, len(k)+1)
 | 
			
		||||
	copy(newKey, k)
 | 
			
		||||
	newKey[len(k)] = piece
 | 
			
		||||
	return newKey
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Keys returns a slice of every key in the TOML data, including key groups.
 | 
			
		||||
// Each key is itself a slice, where the first element is the top of the
 | 
			
		||||
// hierarchy and the last is the most specific.
 | 
			
		||||
//
 | 
			
		||||
// The list will have the same order as the keys appeared in the TOML data.
 | 
			
		||||
//
 | 
			
		||||
// All keys returned are non-empty.
 | 
			
		||||
func (md *MetaData) Keys() []Key {
 | 
			
		||||
	return md.keys
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Undecoded returns all keys that have not been decoded in the order in which
 | 
			
		||||
// they appear in the original TOML document.
 | 
			
		||||
//
 | 
			
		||||
// This includes keys that haven't been decoded because of a Primitive value.
 | 
			
		||||
// Once the Primitive value is decoded, the keys will be considered decoded.
 | 
			
		||||
//
 | 
			
		||||
// Also note that decoding into an empty interface will result in no decoding,
 | 
			
		||||
// and so no keys will be considered decoded.
 | 
			
		||||
//
 | 
			
		||||
// In this sense, the Undecoded keys correspond to keys in the TOML document
 | 
			
		||||
// that do not have a concrete type in your representation.
 | 
			
		||||
func (md *MetaData) Undecoded() []Key {
 | 
			
		||||
	undecoded := make([]Key, 0, len(md.keys))
 | 
			
		||||
	for _, key := range md.keys {
 | 
			
		||||
		if !md.decoded[key.String()] {
 | 
			
		||||
			undecoded = append(undecoded, key)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return undecoded
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/BurntSushi/toml/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/BurntSushi/toml/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,27 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
Package toml provides facilities for decoding and encoding TOML configuration
 | 
			
		||||
files via reflection. There is also support for delaying decoding with
 | 
			
		||||
the Primitive type, and querying the set of keys in a TOML document with the
 | 
			
		||||
MetaData type.
 | 
			
		||||
 | 
			
		||||
The specification implemented: https://github.com/toml-lang/toml
 | 
			
		||||
 | 
			
		||||
The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify
 | 
			
		||||
whether a file is a valid TOML document. It can also be used to print the
 | 
			
		||||
type of each key in a TOML document.
 | 
			
		||||
 | 
			
		||||
Testing
 | 
			
		||||
 | 
			
		||||
There are two important types of tests used for this package. The first is
 | 
			
		||||
contained inside '*_test.go' files and uses the standard Go unit testing
 | 
			
		||||
framework. These tests are primarily devoted to holistically testing the
 | 
			
		||||
decoder and encoder.
 | 
			
		||||
 | 
			
		||||
The second type of testing is used to verify the implementation's adherence
 | 
			
		||||
to the TOML specification. These tests have been factored into their own
 | 
			
		||||
project: https://github.com/BurntSushi/toml-test
 | 
			
		||||
 | 
			
		||||
The reason the tests are in a separate project is so that they can be used by
 | 
			
		||||
any implementation of TOML. Namely, it is language agnostic.
 | 
			
		||||
*/
 | 
			
		||||
package toml
 | 
			
		||||
							
								
								
									
										568
									
								
								vendor/github.com/BurntSushi/toml/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										568
									
								
								vendor/github.com/BurntSushi/toml/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,568 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type tomlEncodeError struct{ error }
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	errArrayMixedElementTypes = errors.New(
 | 
			
		||||
		"toml: cannot encode array with mixed element types")
 | 
			
		||||
	errArrayNilElement = errors.New(
 | 
			
		||||
		"toml: cannot encode array with nil element")
 | 
			
		||||
	errNonString = errors.New(
 | 
			
		||||
		"toml: cannot encode a map with non-string key type")
 | 
			
		||||
	errAnonNonStruct = errors.New(
 | 
			
		||||
		"toml: cannot encode an anonymous field that is not a struct")
 | 
			
		||||
	errArrayNoTable = errors.New(
 | 
			
		||||
		"toml: TOML array element cannot contain a table")
 | 
			
		||||
	errNoKey = errors.New(
 | 
			
		||||
		"toml: top-level values must be Go maps or structs")
 | 
			
		||||
	errAnything = errors.New("") // used in testing
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var quotedReplacer = strings.NewReplacer(
 | 
			
		||||
	"\t", "\\t",
 | 
			
		||||
	"\n", "\\n",
 | 
			
		||||
	"\r", "\\r",
 | 
			
		||||
	"\"", "\\\"",
 | 
			
		||||
	"\\", "\\\\",
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Encoder controls the encoding of Go values to a TOML document to some
 | 
			
		||||
// io.Writer.
 | 
			
		||||
//
 | 
			
		||||
// The indentation level can be controlled with the Indent field.
 | 
			
		||||
type Encoder struct {
 | 
			
		||||
	// A single indentation level. By default it is two spaces.
 | 
			
		||||
	Indent string
 | 
			
		||||
 | 
			
		||||
	// hasWritten is whether we have written any output to w yet.
 | 
			
		||||
	hasWritten bool
 | 
			
		||||
	w          *bufio.Writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer
 | 
			
		||||
// given. By default, a single indentation level is 2 spaces.
 | 
			
		||||
func NewEncoder(w io.Writer) *Encoder {
 | 
			
		||||
	return &Encoder{
 | 
			
		||||
		w:      bufio.NewWriter(w),
 | 
			
		||||
		Indent: "  ",
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Encode writes a TOML representation of the Go value to the underlying
 | 
			
		||||
// io.Writer. If the value given cannot be encoded to a valid TOML document,
 | 
			
		||||
// then an error is returned.
 | 
			
		||||
//
 | 
			
		||||
// The mapping between Go values and TOML values should be precisely the same
 | 
			
		||||
// as for the Decode* functions. Similarly, the TextMarshaler interface is
 | 
			
		||||
// supported by encoding the resulting bytes as strings. (If you want to write
 | 
			
		||||
// arbitrary binary data then you will need to use something like base64 since
 | 
			
		||||
// TOML does not have any binary types.)
 | 
			
		||||
//
 | 
			
		||||
// When encoding TOML hashes (i.e., Go maps or structs), keys without any
 | 
			
		||||
// sub-hashes are encoded first.
 | 
			
		||||
//
 | 
			
		||||
// If a Go map is encoded, then its keys are sorted alphabetically for
 | 
			
		||||
// deterministic output. More control over this behavior may be provided if
 | 
			
		||||
// there is demand for it.
 | 
			
		||||
//
 | 
			
		||||
// Encoding Go values without a corresponding TOML representation---like map
 | 
			
		||||
// types with non-string keys---will cause an error to be returned. Similarly
 | 
			
		||||
// for mixed arrays/slices, arrays/slices with nil elements, embedded
 | 
			
		||||
// non-struct types and nested slices containing maps or structs.
 | 
			
		||||
// (e.g., [][]map[string]string is not allowed but []map[string]string is OK
 | 
			
		||||
// and so is []map[string][]string.)
 | 
			
		||||
func (enc *Encoder) Encode(v interface{}) error {
 | 
			
		||||
	rv := eindirect(reflect.ValueOf(v))
 | 
			
		||||
	if err := enc.safeEncode(Key([]string{}), rv); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return enc.w.Flush()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) {
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if r := recover(); r != nil {
 | 
			
		||||
			if terr, ok := r.(tomlEncodeError); ok {
 | 
			
		||||
				err = terr.error
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			panic(r)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	enc.encode(key, rv)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) encode(key Key, rv reflect.Value) {
 | 
			
		||||
	// Special case. Time needs to be in ISO8601 format.
 | 
			
		||||
	// Special case. If we can marshal the type to text, then we used that.
 | 
			
		||||
	// Basically, this prevents the encoder for handling these types as
 | 
			
		||||
	// generic structs (or whatever the underlying type of a TextMarshaler is).
 | 
			
		||||
	switch rv.Interface().(type) {
 | 
			
		||||
	case time.Time, TextMarshaler:
 | 
			
		||||
		enc.keyEqElement(key, rv)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	k := rv.Kind()
 | 
			
		||||
	switch k {
 | 
			
		||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
 | 
			
		||||
		reflect.Int64,
 | 
			
		||||
		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
 | 
			
		||||
		reflect.Uint64,
 | 
			
		||||
		reflect.Float32, reflect.Float64, reflect.String, reflect.Bool:
 | 
			
		||||
		enc.keyEqElement(key, rv)
 | 
			
		||||
	case reflect.Array, reflect.Slice:
 | 
			
		||||
		if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) {
 | 
			
		||||
			enc.eArrayOfTables(key, rv)
 | 
			
		||||
		} else {
 | 
			
		||||
			enc.keyEqElement(key, rv)
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		if rv.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		enc.encode(key, rv.Elem())
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		if rv.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		enc.eTable(key, rv)
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		if rv.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		enc.encode(key, rv.Elem())
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		enc.eTable(key, rv)
 | 
			
		||||
	default:
 | 
			
		||||
		panic(e("unsupported type for key '%s': %s", key, k))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// eElement encodes any value that can be an array element (primitives and
 | 
			
		||||
// arrays).
 | 
			
		||||
func (enc *Encoder) eElement(rv reflect.Value) {
 | 
			
		||||
	switch v := rv.Interface().(type) {
 | 
			
		||||
	case time.Time:
 | 
			
		||||
		// Special case time.Time as a primitive. Has to come before
 | 
			
		||||
		// TextMarshaler below because time.Time implements
 | 
			
		||||
		// encoding.TextMarshaler, but we need to always use UTC.
 | 
			
		||||
		enc.wf(v.UTC().Format("2006-01-02T15:04:05Z"))
 | 
			
		||||
		return
 | 
			
		||||
	case TextMarshaler:
 | 
			
		||||
		// Special case. Use text marshaler if it's available for this value.
 | 
			
		||||
		if s, err := v.MarshalText(); err != nil {
 | 
			
		||||
			encPanic(err)
 | 
			
		||||
		} else {
 | 
			
		||||
			enc.writeQuoted(string(s))
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	switch rv.Kind() {
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		enc.wf(strconv.FormatBool(rv.Bool()))
 | 
			
		||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
 | 
			
		||||
		reflect.Int64:
 | 
			
		||||
		enc.wf(strconv.FormatInt(rv.Int(), 10))
 | 
			
		||||
	case reflect.Uint, reflect.Uint8, reflect.Uint16,
 | 
			
		||||
		reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		enc.wf(strconv.FormatUint(rv.Uint(), 10))
 | 
			
		||||
	case reflect.Float32:
 | 
			
		||||
		enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32)))
 | 
			
		||||
	case reflect.Float64:
 | 
			
		||||
		enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64)))
 | 
			
		||||
	case reflect.Array, reflect.Slice:
 | 
			
		||||
		enc.eArrayOrSliceElement(rv)
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		enc.eElement(rv.Elem())
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		enc.writeQuoted(rv.String())
 | 
			
		||||
	default:
 | 
			
		||||
		panic(e("unexpected primitive type: %s", rv.Kind()))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// By the TOML spec, all floats must have a decimal with at least one
 | 
			
		||||
// number on either side.
 | 
			
		||||
func floatAddDecimal(fstr string) string {
 | 
			
		||||
	if !strings.Contains(fstr, ".") {
 | 
			
		||||
		return fstr + ".0"
 | 
			
		||||
	}
 | 
			
		||||
	return fstr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) writeQuoted(s string) {
 | 
			
		||||
	enc.wf("\"%s\"", quotedReplacer.Replace(s))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) {
 | 
			
		||||
	length := rv.Len()
 | 
			
		||||
	enc.wf("[")
 | 
			
		||||
	for i := 0; i < length; i++ {
 | 
			
		||||
		elem := rv.Index(i)
 | 
			
		||||
		enc.eElement(elem)
 | 
			
		||||
		if i != length-1 {
 | 
			
		||||
			enc.wf(", ")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	enc.wf("]")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) {
 | 
			
		||||
	if len(key) == 0 {
 | 
			
		||||
		encPanic(errNoKey)
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < rv.Len(); i++ {
 | 
			
		||||
		trv := rv.Index(i)
 | 
			
		||||
		if isNil(trv) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		panicIfInvalidKey(key)
 | 
			
		||||
		enc.newline()
 | 
			
		||||
		enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll())
 | 
			
		||||
		enc.newline()
 | 
			
		||||
		enc.eMapOrStruct(key, trv)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eTable(key Key, rv reflect.Value) {
 | 
			
		||||
	panicIfInvalidKey(key)
 | 
			
		||||
	if len(key) == 1 {
 | 
			
		||||
		// Output an extra newline between top-level tables.
 | 
			
		||||
		// (The newline isn't written if nothing else has been written though.)
 | 
			
		||||
		enc.newline()
 | 
			
		||||
	}
 | 
			
		||||
	if len(key) > 0 {
 | 
			
		||||
		enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll())
 | 
			
		||||
		enc.newline()
 | 
			
		||||
	}
 | 
			
		||||
	enc.eMapOrStruct(key, rv)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) {
 | 
			
		||||
	switch rv := eindirect(rv); rv.Kind() {
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		enc.eMap(key, rv)
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		enc.eStruct(key, rv)
 | 
			
		||||
	default:
 | 
			
		||||
		panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eMap(key Key, rv reflect.Value) {
 | 
			
		||||
	rt := rv.Type()
 | 
			
		||||
	if rt.Key().Kind() != reflect.String {
 | 
			
		||||
		encPanic(errNonString)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Sort keys so that we have deterministic output. And write keys directly
 | 
			
		||||
	// underneath this key first, before writing sub-structs or sub-maps.
 | 
			
		||||
	var mapKeysDirect, mapKeysSub []string
 | 
			
		||||
	for _, mapKey := range rv.MapKeys() {
 | 
			
		||||
		k := mapKey.String()
 | 
			
		||||
		if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) {
 | 
			
		||||
			mapKeysSub = append(mapKeysSub, k)
 | 
			
		||||
		} else {
 | 
			
		||||
			mapKeysDirect = append(mapKeysDirect, k)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var writeMapKeys = func(mapKeys []string) {
 | 
			
		||||
		sort.Strings(mapKeys)
 | 
			
		||||
		for _, mapKey := range mapKeys {
 | 
			
		||||
			mrv := rv.MapIndex(reflect.ValueOf(mapKey))
 | 
			
		||||
			if isNil(mrv) {
 | 
			
		||||
				// Don't write anything for nil fields.
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			enc.encode(key.add(mapKey), mrv)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	writeMapKeys(mapKeysDirect)
 | 
			
		||||
	writeMapKeys(mapKeysSub)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) eStruct(key Key, rv reflect.Value) {
 | 
			
		||||
	// Write keys for fields directly under this key first, because if we write
 | 
			
		||||
	// a field that creates a new table, then all keys under it will be in that
 | 
			
		||||
	// table (not the one we're writing here).
 | 
			
		||||
	rt := rv.Type()
 | 
			
		||||
	var fieldsDirect, fieldsSub [][]int
 | 
			
		||||
	var addFields func(rt reflect.Type, rv reflect.Value, start []int)
 | 
			
		||||
	addFields = func(rt reflect.Type, rv reflect.Value, start []int) {
 | 
			
		||||
		for i := 0; i < rt.NumField(); i++ {
 | 
			
		||||
			f := rt.Field(i)
 | 
			
		||||
			// skip unexported fields
 | 
			
		||||
			if f.PkgPath != "" && !f.Anonymous {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			frv := rv.Field(i)
 | 
			
		||||
			if f.Anonymous {
 | 
			
		||||
				t := f.Type
 | 
			
		||||
				switch t.Kind() {
 | 
			
		||||
				case reflect.Struct:
 | 
			
		||||
					// Treat anonymous struct fields with
 | 
			
		||||
					// tag names as though they are not
 | 
			
		||||
					// anonymous, like encoding/json does.
 | 
			
		||||
					if getOptions(f.Tag).name == "" {
 | 
			
		||||
						addFields(t, frv, f.Index)
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
				case reflect.Ptr:
 | 
			
		||||
					if t.Elem().Kind() == reflect.Struct &&
 | 
			
		||||
						getOptions(f.Tag).name == "" {
 | 
			
		||||
						if !frv.IsNil() {
 | 
			
		||||
							addFields(t.Elem(), frv.Elem(), f.Index)
 | 
			
		||||
						}
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
					// Fall through to the normal field encoding logic below
 | 
			
		||||
					// for non-struct anonymous fields.
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if typeIsHash(tomlTypeOfGo(frv)) {
 | 
			
		||||
				fieldsSub = append(fieldsSub, append(start, f.Index...))
 | 
			
		||||
			} else {
 | 
			
		||||
				fieldsDirect = append(fieldsDirect, append(start, f.Index...))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	addFields(rt, rv, nil)
 | 
			
		||||
 | 
			
		||||
	var writeFields = func(fields [][]int) {
 | 
			
		||||
		for _, fieldIndex := range fields {
 | 
			
		||||
			sft := rt.FieldByIndex(fieldIndex)
 | 
			
		||||
			sf := rv.FieldByIndex(fieldIndex)
 | 
			
		||||
			if isNil(sf) {
 | 
			
		||||
				// Don't write anything for nil fields.
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			opts := getOptions(sft.Tag)
 | 
			
		||||
			if opts.skip {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			keyName := sft.Name
 | 
			
		||||
			if opts.name != "" {
 | 
			
		||||
				keyName = opts.name
 | 
			
		||||
			}
 | 
			
		||||
			if opts.omitempty && isEmpty(sf) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if opts.omitzero && isZero(sf) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			enc.encode(key.add(keyName), sf)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	writeFields(fieldsDirect)
 | 
			
		||||
	writeFields(fieldsSub)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tomlTypeName returns the TOML type name of the Go value's type. It is
 | 
			
		||||
// used to determine whether the types of array elements are mixed (which is
 | 
			
		||||
// forbidden). If the Go value is nil, then it is illegal for it to be an array
 | 
			
		||||
// element, and valueIsNil is returned as true.
 | 
			
		||||
 | 
			
		||||
// Returns the TOML type of a Go value. The type may be `nil`, which means
 | 
			
		||||
// no concrete TOML type could be found.
 | 
			
		||||
func tomlTypeOfGo(rv reflect.Value) tomlType {
 | 
			
		||||
	if isNil(rv) || !rv.IsValid() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	switch rv.Kind() {
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		return tomlBool
 | 
			
		||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
 | 
			
		||||
		reflect.Int64,
 | 
			
		||||
		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
 | 
			
		||||
		reflect.Uint64:
 | 
			
		||||
		return tomlInteger
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		return tomlFloat
 | 
			
		||||
	case reflect.Array, reflect.Slice:
 | 
			
		||||
		if typeEqual(tomlHash, tomlArrayType(rv)) {
 | 
			
		||||
			return tomlArrayHash
 | 
			
		||||
		}
 | 
			
		||||
		return tomlArray
 | 
			
		||||
	case reflect.Ptr, reflect.Interface:
 | 
			
		||||
		return tomlTypeOfGo(rv.Elem())
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		return tomlString
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		return tomlHash
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		switch rv.Interface().(type) {
 | 
			
		||||
		case time.Time:
 | 
			
		||||
			return tomlDatetime
 | 
			
		||||
		case TextMarshaler:
 | 
			
		||||
			return tomlString
 | 
			
		||||
		default:
 | 
			
		||||
			return tomlHash
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		panic("unexpected reflect.Kind: " + rv.Kind().String())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tomlArrayType returns the element type of a TOML array. The type returned
 | 
			
		||||
// may be nil if it cannot be determined (e.g., a nil slice or a zero length
 | 
			
		||||
// slize). This function may also panic if it finds a type that cannot be
 | 
			
		||||
// expressed in TOML (such as nil elements, heterogeneous arrays or directly
 | 
			
		||||
// nested arrays of tables).
 | 
			
		||||
func tomlArrayType(rv reflect.Value) tomlType {
 | 
			
		||||
	if isNil(rv) || !rv.IsValid() || rv.Len() == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	firstType := tomlTypeOfGo(rv.Index(0))
 | 
			
		||||
	if firstType == nil {
 | 
			
		||||
		encPanic(errArrayNilElement)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rvlen := rv.Len()
 | 
			
		||||
	for i := 1; i < rvlen; i++ {
 | 
			
		||||
		elem := rv.Index(i)
 | 
			
		||||
		switch elemType := tomlTypeOfGo(elem); {
 | 
			
		||||
		case elemType == nil:
 | 
			
		||||
			encPanic(errArrayNilElement)
 | 
			
		||||
		case !typeEqual(firstType, elemType):
 | 
			
		||||
			encPanic(errArrayMixedElementTypes)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// If we have a nested array, then we must make sure that the nested
 | 
			
		||||
	// array contains ONLY primitives.
 | 
			
		||||
	// This checks arbitrarily nested arrays.
 | 
			
		||||
	if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) {
 | 
			
		||||
		nest := tomlArrayType(eindirect(rv.Index(0)))
 | 
			
		||||
		if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) {
 | 
			
		||||
			encPanic(errArrayNoTable)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return firstType
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type tagOptions struct {
 | 
			
		||||
	skip      bool // "-"
 | 
			
		||||
	name      string
 | 
			
		||||
	omitempty bool
 | 
			
		||||
	omitzero  bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getOptions(tag reflect.StructTag) tagOptions {
 | 
			
		||||
	t := tag.Get("toml")
 | 
			
		||||
	if t == "-" {
 | 
			
		||||
		return tagOptions{skip: true}
 | 
			
		||||
	}
 | 
			
		||||
	var opts tagOptions
 | 
			
		||||
	parts := strings.Split(t, ",")
 | 
			
		||||
	opts.name = parts[0]
 | 
			
		||||
	for _, s := range parts[1:] {
 | 
			
		||||
		switch s {
 | 
			
		||||
		case "omitempty":
 | 
			
		||||
			opts.omitempty = true
 | 
			
		||||
		case "omitzero":
 | 
			
		||||
			opts.omitzero = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return opts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isZero(rv reflect.Value) bool {
 | 
			
		||||
	switch rv.Kind() {
 | 
			
		||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
 | 
			
		||||
		return rv.Int() == 0
 | 
			
		||||
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		return rv.Uint() == 0
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		return rv.Float() == 0.0
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isEmpty(rv reflect.Value) bool {
 | 
			
		||||
	switch rv.Kind() {
 | 
			
		||||
	case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
 | 
			
		||||
		return rv.Len() == 0
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		return !rv.Bool()
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) newline() {
 | 
			
		||||
	if enc.hasWritten {
 | 
			
		||||
		enc.wf("\n")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) keyEqElement(key Key, val reflect.Value) {
 | 
			
		||||
	if len(key) == 0 {
 | 
			
		||||
		encPanic(errNoKey)
 | 
			
		||||
	}
 | 
			
		||||
	panicIfInvalidKey(key)
 | 
			
		||||
	enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1))
 | 
			
		||||
	enc.eElement(val)
 | 
			
		||||
	enc.newline()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) wf(format string, v ...interface{}) {
 | 
			
		||||
	if _, err := fmt.Fprintf(enc.w, format, v...); err != nil {
 | 
			
		||||
		encPanic(err)
 | 
			
		||||
	}
 | 
			
		||||
	enc.hasWritten = true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) indentStr(key Key) string {
 | 
			
		||||
	return strings.Repeat(enc.Indent, len(key)-1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func encPanic(err error) {
 | 
			
		||||
	panic(tomlEncodeError{err})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func eindirect(v reflect.Value) reflect.Value {
 | 
			
		||||
	switch v.Kind() {
 | 
			
		||||
	case reflect.Ptr, reflect.Interface:
 | 
			
		||||
		return eindirect(v.Elem())
 | 
			
		||||
	default:
 | 
			
		||||
		return v
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isNil(rv reflect.Value) bool {
 | 
			
		||||
	switch rv.Kind() {
 | 
			
		||||
	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
 | 
			
		||||
		return rv.IsNil()
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func panicIfInvalidKey(key Key) {
 | 
			
		||||
	for _, k := range key {
 | 
			
		||||
		if len(k) == 0 {
 | 
			
		||||
			encPanic(e("Key '%s' is not a valid table name. Key names "+
 | 
			
		||||
				"cannot be empty.", key.maybeQuotedAll()))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isValidKeyName(s string) bool {
 | 
			
		||||
	return len(s) != 0
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/BurntSushi/toml/encoding_types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/BurntSushi/toml/encoding_types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,19 +0,0 @@
 | 
			
		|||
// +build go1.2
 | 
			
		||||
 | 
			
		||||
package toml
 | 
			
		||||
 | 
			
		||||
// In order to support Go 1.1, we define our own TextMarshaler and
 | 
			
		||||
// TextUnmarshaler types. For Go 1.2+, we just alias them with the
 | 
			
		||||
// standard library interfaces.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here
 | 
			
		||||
// so that Go 1.1 can be supported.
 | 
			
		||||
type TextMarshaler encoding.TextMarshaler
 | 
			
		||||
 | 
			
		||||
// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined
 | 
			
		||||
// here so that Go 1.1 can be supported.
 | 
			
		||||
type TextUnmarshaler encoding.TextUnmarshaler
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/BurntSushi/toml/encoding_types_1.1.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/BurntSushi/toml/encoding_types_1.1.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,18 +0,0 @@
 | 
			
		|||
// +build !go1.2
 | 
			
		||||
 | 
			
		||||
package toml
 | 
			
		||||
 | 
			
		||||
// These interfaces were introduced in Go 1.2, so we add them manually when
 | 
			
		||||
// compiling for Go 1.1.
 | 
			
		||||
 | 
			
		||||
// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here
 | 
			
		||||
// so that Go 1.1 can be supported.
 | 
			
		||||
type TextMarshaler interface {
 | 
			
		||||
	MarshalText() (text []byte, err error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined
 | 
			
		||||
// here so that Go 1.1 can be supported.
 | 
			
		||||
type TextUnmarshaler interface {
 | 
			
		||||
	UnmarshalText(text []byte) error
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										953
									
								
								vendor/github.com/BurntSushi/toml/lex.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										953
									
								
								vendor/github.com/BurntSushi/toml/lex.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,953 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type itemType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	itemError itemType = iota
 | 
			
		||||
	itemNIL            // used in the parser to indicate no type
 | 
			
		||||
	itemEOF
 | 
			
		||||
	itemText
 | 
			
		||||
	itemString
 | 
			
		||||
	itemRawString
 | 
			
		||||
	itemMultilineString
 | 
			
		||||
	itemRawMultilineString
 | 
			
		||||
	itemBool
 | 
			
		||||
	itemInteger
 | 
			
		||||
	itemFloat
 | 
			
		||||
	itemDatetime
 | 
			
		||||
	itemArray // the start of an array
 | 
			
		||||
	itemArrayEnd
 | 
			
		||||
	itemTableStart
 | 
			
		||||
	itemTableEnd
 | 
			
		||||
	itemArrayTableStart
 | 
			
		||||
	itemArrayTableEnd
 | 
			
		||||
	itemKeyStart
 | 
			
		||||
	itemCommentStart
 | 
			
		||||
	itemInlineTableStart
 | 
			
		||||
	itemInlineTableEnd
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	eof              = 0
 | 
			
		||||
	comma            = ','
 | 
			
		||||
	tableStart       = '['
 | 
			
		||||
	tableEnd         = ']'
 | 
			
		||||
	arrayTableStart  = '['
 | 
			
		||||
	arrayTableEnd    = ']'
 | 
			
		||||
	tableSep         = '.'
 | 
			
		||||
	keySep           = '='
 | 
			
		||||
	arrayStart       = '['
 | 
			
		||||
	arrayEnd         = ']'
 | 
			
		||||
	commentStart     = '#'
 | 
			
		||||
	stringStart      = '"'
 | 
			
		||||
	stringEnd        = '"'
 | 
			
		||||
	rawStringStart   = '\''
 | 
			
		||||
	rawStringEnd     = '\''
 | 
			
		||||
	inlineTableStart = '{'
 | 
			
		||||
	inlineTableEnd   = '}'
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type stateFn func(lx *lexer) stateFn
 | 
			
		||||
 | 
			
		||||
type lexer struct {
 | 
			
		||||
	input string
 | 
			
		||||
	start int
 | 
			
		||||
	pos   int
 | 
			
		||||
	line  int
 | 
			
		||||
	state stateFn
 | 
			
		||||
	items chan item
 | 
			
		||||
 | 
			
		||||
	// Allow for backing up up to three runes.
 | 
			
		||||
	// This is necessary because TOML contains 3-rune tokens (""" and ''').
 | 
			
		||||
	prevWidths [3]int
 | 
			
		||||
	nprev      int // how many of prevWidths are in use
 | 
			
		||||
	// If we emit an eof, we can still back up, but it is not OK to call
 | 
			
		||||
	// next again.
 | 
			
		||||
	atEOF bool
 | 
			
		||||
 | 
			
		||||
	// A stack of state functions used to maintain context.
 | 
			
		||||
	// The idea is to reuse parts of the state machine in various places.
 | 
			
		||||
	// For example, values can appear at the top level or within arbitrarily
 | 
			
		||||
	// nested arrays. The last state on the stack is used after a value has
 | 
			
		||||
	// been lexed. Similarly for comments.
 | 
			
		||||
	stack []stateFn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type item struct {
 | 
			
		||||
	typ  itemType
 | 
			
		||||
	val  string
 | 
			
		||||
	line int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) nextItem() item {
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case item := <-lx.items:
 | 
			
		||||
			return item
 | 
			
		||||
		default:
 | 
			
		||||
			lx.state = lx.state(lx)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lex(input string) *lexer {
 | 
			
		||||
	lx := &lexer{
 | 
			
		||||
		input: input,
 | 
			
		||||
		state: lexTop,
 | 
			
		||||
		line:  1,
 | 
			
		||||
		items: make(chan item, 10),
 | 
			
		||||
		stack: make([]stateFn, 0, 10),
 | 
			
		||||
	}
 | 
			
		||||
	return lx
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) push(state stateFn) {
 | 
			
		||||
	lx.stack = append(lx.stack, state)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) pop() stateFn {
 | 
			
		||||
	if len(lx.stack) == 0 {
 | 
			
		||||
		return lx.errorf("BUG in lexer: no states to pop")
 | 
			
		||||
	}
 | 
			
		||||
	last := lx.stack[len(lx.stack)-1]
 | 
			
		||||
	lx.stack = lx.stack[0 : len(lx.stack)-1]
 | 
			
		||||
	return last
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) current() string {
 | 
			
		||||
	return lx.input[lx.start:lx.pos]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) emit(typ itemType) {
 | 
			
		||||
	lx.items <- item{typ, lx.current(), lx.line}
 | 
			
		||||
	lx.start = lx.pos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) emitTrim(typ itemType) {
 | 
			
		||||
	lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line}
 | 
			
		||||
	lx.start = lx.pos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (lx *lexer) next() (r rune) {
 | 
			
		||||
	if lx.atEOF {
 | 
			
		||||
		panic("next called after EOF")
 | 
			
		||||
	}
 | 
			
		||||
	if lx.pos >= len(lx.input) {
 | 
			
		||||
		lx.atEOF = true
 | 
			
		||||
		return eof
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if lx.input[lx.pos] == '\n' {
 | 
			
		||||
		lx.line++
 | 
			
		||||
	}
 | 
			
		||||
	lx.prevWidths[2] = lx.prevWidths[1]
 | 
			
		||||
	lx.prevWidths[1] = lx.prevWidths[0]
 | 
			
		||||
	if lx.nprev < 3 {
 | 
			
		||||
		lx.nprev++
 | 
			
		||||
	}
 | 
			
		||||
	r, w := utf8.DecodeRuneInString(lx.input[lx.pos:])
 | 
			
		||||
	lx.prevWidths[0] = w
 | 
			
		||||
	lx.pos += w
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ignore skips over the pending input before this point.
 | 
			
		||||
func (lx *lexer) ignore() {
 | 
			
		||||
	lx.start = lx.pos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// backup steps back one rune. Can be called only twice between calls to next.
 | 
			
		||||
func (lx *lexer) backup() {
 | 
			
		||||
	if lx.atEOF {
 | 
			
		||||
		lx.atEOF = false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if lx.nprev < 1 {
 | 
			
		||||
		panic("backed up too far")
 | 
			
		||||
	}
 | 
			
		||||
	w := lx.prevWidths[0]
 | 
			
		||||
	lx.prevWidths[0] = lx.prevWidths[1]
 | 
			
		||||
	lx.prevWidths[1] = lx.prevWidths[2]
 | 
			
		||||
	lx.nprev--
 | 
			
		||||
	lx.pos -= w
 | 
			
		||||
	if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' {
 | 
			
		||||
		lx.line--
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// accept consumes the next rune if it's equal to `valid`.
 | 
			
		||||
func (lx *lexer) accept(valid rune) bool {
 | 
			
		||||
	if lx.next() == valid {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// peek returns but does not consume the next rune in the input.
 | 
			
		||||
func (lx *lexer) peek() rune {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// skip ignores all input that matches the given predicate.
 | 
			
		||||
func (lx *lexer) skip(pred func(rune) bool) {
 | 
			
		||||
	for {
 | 
			
		||||
		r := lx.next()
 | 
			
		||||
		if pred(r) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// errorf stops all lexing by emitting an error and returning `nil`.
 | 
			
		||||
// Note that any value that is a character is escaped if it's a special
 | 
			
		||||
// character (newlines, tabs, etc.).
 | 
			
		||||
func (lx *lexer) errorf(format string, values ...interface{}) stateFn {
 | 
			
		||||
	lx.items <- item{
 | 
			
		||||
		itemError,
 | 
			
		||||
		fmt.Sprintf(format, values...),
 | 
			
		||||
		lx.line,
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexTop consumes elements at the top level of TOML data.
 | 
			
		||||
func lexTop(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isWhitespace(r) || isNL(r) {
 | 
			
		||||
		return lexSkip(lx, lexTop)
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case commentStart:
 | 
			
		||||
		lx.push(lexTop)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case tableStart:
 | 
			
		||||
		return lexTableStart
 | 
			
		||||
	case eof:
 | 
			
		||||
		if lx.pos > lx.start {
 | 
			
		||||
			return lx.errorf("unexpected EOF")
 | 
			
		||||
		}
 | 
			
		||||
		lx.emit(itemEOF)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// At this point, the only valid item can be a key, so we back up
 | 
			
		||||
	// and let the key lexer do the rest.
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.push(lexTopEnd)
 | 
			
		||||
	return lexKeyStart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexTopEnd is entered whenever a top-level item has been consumed. (A value
 | 
			
		||||
// or a table.) It must see only whitespace, and will turn back to lexTop
 | 
			
		||||
// upon a newline. If it sees EOF, it will quit the lexer successfully.
 | 
			
		||||
func lexTopEnd(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case r == commentStart:
 | 
			
		||||
		// a comment will read to a newline for us.
 | 
			
		||||
		lx.push(lexTop)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexTopEnd
 | 
			
		||||
	case isNL(r):
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lexTop
 | 
			
		||||
	case r == eof:
 | 
			
		||||
		lx.emit(itemEOF)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("expected a top-level item to end with a newline, "+
 | 
			
		||||
		"comment, or EOF, but got %q instead", r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexTable lexes the beginning of a table. Namely, it makes sure that
 | 
			
		||||
// it starts with a character other than '.' and ']'.
 | 
			
		||||
// It assumes that '[' has already been consumed.
 | 
			
		||||
// It also handles the case that this is an item in an array of tables.
 | 
			
		||||
// e.g., '[[name]]'.
 | 
			
		||||
func lexTableStart(lx *lexer) stateFn {
 | 
			
		||||
	if lx.peek() == arrayTableStart {
 | 
			
		||||
		lx.next()
 | 
			
		||||
		lx.emit(itemArrayTableStart)
 | 
			
		||||
		lx.push(lexArrayTableEnd)
 | 
			
		||||
	} else {
 | 
			
		||||
		lx.emit(itemTableStart)
 | 
			
		||||
		lx.push(lexTableEnd)
 | 
			
		||||
	}
 | 
			
		||||
	return lexTableNameStart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexTableEnd(lx *lexer) stateFn {
 | 
			
		||||
	lx.emit(itemTableEnd)
 | 
			
		||||
	return lexTopEnd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexArrayTableEnd(lx *lexer) stateFn {
 | 
			
		||||
	if r := lx.next(); r != arrayTableEnd {
 | 
			
		||||
		return lx.errorf("expected end of table array name delimiter %q, "+
 | 
			
		||||
			"but got %q instead", arrayTableEnd, r)
 | 
			
		||||
	}
 | 
			
		||||
	lx.emit(itemArrayTableEnd)
 | 
			
		||||
	return lexTopEnd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexTableNameStart(lx *lexer) stateFn {
 | 
			
		||||
	lx.skip(isWhitespace)
 | 
			
		||||
	switch r := lx.peek(); {
 | 
			
		||||
	case r == tableEnd || r == eof:
 | 
			
		||||
		return lx.errorf("unexpected end of table name " +
 | 
			
		||||
			"(table names cannot be empty)")
 | 
			
		||||
	case r == tableSep:
 | 
			
		||||
		return lx.errorf("unexpected table separator " +
 | 
			
		||||
			"(table names cannot be empty)")
 | 
			
		||||
	case r == stringStart || r == rawStringStart:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		lx.push(lexTableNameEnd)
 | 
			
		||||
		return lexValue // reuse string lexing
 | 
			
		||||
	default:
 | 
			
		||||
		return lexBareTableName
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexBareTableName lexes the name of a table. It assumes that at least one
 | 
			
		||||
// valid character for the table has already been read.
 | 
			
		||||
func lexBareTableName(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isBareKeyChar(r) {
 | 
			
		||||
		return lexBareTableName
 | 
			
		||||
	}
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.emit(itemText)
 | 
			
		||||
	return lexTableNameEnd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexTableNameEnd reads the end of a piece of a table name, optionally
 | 
			
		||||
// consuming whitespace.
 | 
			
		||||
func lexTableNameEnd(lx *lexer) stateFn {
 | 
			
		||||
	lx.skip(isWhitespace)
 | 
			
		||||
	switch r := lx.next(); {
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexTableNameEnd
 | 
			
		||||
	case r == tableSep:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lexTableNameStart
 | 
			
		||||
	case r == tableEnd:
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	default:
 | 
			
		||||
		return lx.errorf("expected '.' or ']' to end table name, "+
 | 
			
		||||
			"but got %q instead", r)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexKeyStart consumes a key name up until the first non-whitespace character.
 | 
			
		||||
// lexKeyStart will ignore whitespace.
 | 
			
		||||
func lexKeyStart(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.peek()
 | 
			
		||||
	switch {
 | 
			
		||||
	case r == keySep:
 | 
			
		||||
		return lx.errorf("unexpected key separator %q", keySep)
 | 
			
		||||
	case isWhitespace(r) || isNL(r):
 | 
			
		||||
		lx.next()
 | 
			
		||||
		return lexSkip(lx, lexKeyStart)
 | 
			
		||||
	case r == stringStart || r == rawStringStart:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		lx.emit(itemKeyStart)
 | 
			
		||||
		lx.push(lexKeyEnd)
 | 
			
		||||
		return lexValue // reuse string lexing
 | 
			
		||||
	default:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		lx.emit(itemKeyStart)
 | 
			
		||||
		return lexBareKey
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexBareKey consumes the text of a bare key. Assumes that the first character
 | 
			
		||||
// (which is not whitespace) has not yet been consumed.
 | 
			
		||||
func lexBareKey(lx *lexer) stateFn {
 | 
			
		||||
	switch r := lx.next(); {
 | 
			
		||||
	case isBareKeyChar(r):
 | 
			
		||||
		return lexBareKey
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		lx.emit(itemText)
 | 
			
		||||
		return lexKeyEnd
 | 
			
		||||
	case r == keySep:
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		lx.emit(itemText)
 | 
			
		||||
		return lexKeyEnd
 | 
			
		||||
	default:
 | 
			
		||||
		return lx.errorf("bare keys cannot contain %q", r)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexKeyEnd consumes the end of a key and trims whitespace (up to the key
 | 
			
		||||
// separator).
 | 
			
		||||
func lexKeyEnd(lx *lexer) stateFn {
 | 
			
		||||
	switch r := lx.next(); {
 | 
			
		||||
	case r == keySep:
 | 
			
		||||
		return lexSkip(lx, lexValue)
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexSkip(lx, lexKeyEnd)
 | 
			
		||||
	default:
 | 
			
		||||
		return lx.errorf("expected key separator %q, but got %q instead",
 | 
			
		||||
			keySep, r)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexValue starts the consumption of a value anywhere a value is expected.
 | 
			
		||||
// lexValue will ignore whitespace.
 | 
			
		||||
// After a value is lexed, the last state on the next is popped and returned.
 | 
			
		||||
func lexValue(lx *lexer) stateFn {
 | 
			
		||||
	// We allow whitespace to precede a value, but NOT newlines.
 | 
			
		||||
	// In array syntax, the array states are responsible for ignoring newlines.
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexSkip(lx, lexValue)
 | 
			
		||||
	case isDigit(r):
 | 
			
		||||
		lx.backup() // avoid an extra state and use the same as above
 | 
			
		||||
		return lexNumberOrDateStart
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case arrayStart:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		lx.emit(itemArray)
 | 
			
		||||
		return lexArrayValue
 | 
			
		||||
	case inlineTableStart:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		lx.emit(itemInlineTableStart)
 | 
			
		||||
		return lexInlineTableValue
 | 
			
		||||
	case stringStart:
 | 
			
		||||
		if lx.accept(stringStart) {
 | 
			
		||||
			if lx.accept(stringStart) {
 | 
			
		||||
				lx.ignore() // Ignore """
 | 
			
		||||
				return lexMultilineString
 | 
			
		||||
			}
 | 
			
		||||
			lx.backup()
 | 
			
		||||
		}
 | 
			
		||||
		lx.ignore() // ignore the '"'
 | 
			
		||||
		return lexString
 | 
			
		||||
	case rawStringStart:
 | 
			
		||||
		if lx.accept(rawStringStart) {
 | 
			
		||||
			if lx.accept(rawStringStart) {
 | 
			
		||||
				lx.ignore() // Ignore """
 | 
			
		||||
				return lexMultilineRawString
 | 
			
		||||
			}
 | 
			
		||||
			lx.backup()
 | 
			
		||||
		}
 | 
			
		||||
		lx.ignore() // ignore the "'"
 | 
			
		||||
		return lexRawString
 | 
			
		||||
	case '+', '-':
 | 
			
		||||
		return lexNumberStart
 | 
			
		||||
	case '.': // special error case, be kind to users
 | 
			
		||||
		return lx.errorf("floats must start with a digit, not '.'")
 | 
			
		||||
	}
 | 
			
		||||
	if unicode.IsLetter(r) {
 | 
			
		||||
		// Be permissive here; lexBool will give a nice error if the
 | 
			
		||||
		// user wrote something like
 | 
			
		||||
		//   x = foo
 | 
			
		||||
		// (i.e. not 'true' or 'false' but is something else word-like.)
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		return lexBool
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("expected value but found %q instead", r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexArrayValue consumes one value in an array. It assumes that '[' or ','
 | 
			
		||||
// have already been consumed. All whitespace and newlines are ignored.
 | 
			
		||||
func lexArrayValue(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case isWhitespace(r) || isNL(r):
 | 
			
		||||
		return lexSkip(lx, lexArrayValue)
 | 
			
		||||
	case r == commentStart:
 | 
			
		||||
		lx.push(lexArrayValue)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case r == comma:
 | 
			
		||||
		return lx.errorf("unexpected comma")
 | 
			
		||||
	case r == arrayEnd:
 | 
			
		||||
		// NOTE(caleb): The spec isn't clear about whether you can have
 | 
			
		||||
		// a trailing comma or not, so we'll allow it.
 | 
			
		||||
		return lexArrayEnd
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.push(lexArrayValueEnd)
 | 
			
		||||
	return lexValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexArrayValueEnd consumes everything between the end of an array value and
 | 
			
		||||
// the next value (or the end of the array): it ignores whitespace and newlines
 | 
			
		||||
// and expects either a ',' or a ']'.
 | 
			
		||||
func lexArrayValueEnd(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case isWhitespace(r) || isNL(r):
 | 
			
		||||
		return lexSkip(lx, lexArrayValueEnd)
 | 
			
		||||
	case r == commentStart:
 | 
			
		||||
		lx.push(lexArrayValueEnd)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case r == comma:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lexArrayValue // move on to the next value
 | 
			
		||||
	case r == arrayEnd:
 | 
			
		||||
		return lexArrayEnd
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf(
 | 
			
		||||
		"expected a comma or array terminator %q, but got %q instead",
 | 
			
		||||
		arrayEnd, r,
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexArrayEnd finishes the lexing of an array.
 | 
			
		||||
// It assumes that a ']' has just been consumed.
 | 
			
		||||
func lexArrayEnd(lx *lexer) stateFn {
 | 
			
		||||
	lx.ignore()
 | 
			
		||||
	lx.emit(itemArrayEnd)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexInlineTableValue consumes one key/value pair in an inline table.
 | 
			
		||||
// It assumes that '{' or ',' have already been consumed. Whitespace is ignored.
 | 
			
		||||
func lexInlineTableValue(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexSkip(lx, lexInlineTableValue)
 | 
			
		||||
	case isNL(r):
 | 
			
		||||
		return lx.errorf("newlines not allowed within inline tables")
 | 
			
		||||
	case r == commentStart:
 | 
			
		||||
		lx.push(lexInlineTableValue)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case r == comma:
 | 
			
		||||
		return lx.errorf("unexpected comma")
 | 
			
		||||
	case r == inlineTableEnd:
 | 
			
		||||
		return lexInlineTableEnd
 | 
			
		||||
	}
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.push(lexInlineTableValueEnd)
 | 
			
		||||
	return lexKeyStart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexInlineTableValueEnd consumes everything between the end of an inline table
 | 
			
		||||
// key/value pair and the next pair (or the end of the table):
 | 
			
		||||
// it ignores whitespace and expects either a ',' or a '}'.
 | 
			
		||||
func lexInlineTableValueEnd(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case isWhitespace(r):
 | 
			
		||||
		return lexSkip(lx, lexInlineTableValueEnd)
 | 
			
		||||
	case isNL(r):
 | 
			
		||||
		return lx.errorf("newlines not allowed within inline tables")
 | 
			
		||||
	case r == commentStart:
 | 
			
		||||
		lx.push(lexInlineTableValueEnd)
 | 
			
		||||
		return lexCommentStart
 | 
			
		||||
	case r == comma:
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lexInlineTableValue
 | 
			
		||||
	case r == inlineTableEnd:
 | 
			
		||||
		return lexInlineTableEnd
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("expected a comma or an inline table terminator %q, "+
 | 
			
		||||
		"but got %q instead", inlineTableEnd, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexInlineTableEnd finishes the lexing of an inline table.
 | 
			
		||||
// It assumes that a '}' has just been consumed.
 | 
			
		||||
func lexInlineTableEnd(lx *lexer) stateFn {
 | 
			
		||||
	lx.ignore()
 | 
			
		||||
	lx.emit(itemInlineTableEnd)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexString consumes the inner contents of a string. It assumes that the
 | 
			
		||||
// beginning '"' has already been consumed and ignored.
 | 
			
		||||
func lexString(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case r == eof:
 | 
			
		||||
		return lx.errorf("unexpected EOF")
 | 
			
		||||
	case isNL(r):
 | 
			
		||||
		return lx.errorf("strings cannot contain newlines")
 | 
			
		||||
	case r == '\\':
 | 
			
		||||
		lx.push(lexString)
 | 
			
		||||
		return lexStringEscape
 | 
			
		||||
	case r == stringEnd:
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		lx.emit(itemString)
 | 
			
		||||
		lx.next()
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	}
 | 
			
		||||
	return lexString
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexMultilineString consumes the inner contents of a string. It assumes that
 | 
			
		||||
// the beginning '"""' has already been consumed and ignored.
 | 
			
		||||
func lexMultilineString(lx *lexer) stateFn {
 | 
			
		||||
	switch lx.next() {
 | 
			
		||||
	case eof:
 | 
			
		||||
		return lx.errorf("unexpected EOF")
 | 
			
		||||
	case '\\':
 | 
			
		||||
		return lexMultilineStringEscape
 | 
			
		||||
	case stringEnd:
 | 
			
		||||
		if lx.accept(stringEnd) {
 | 
			
		||||
			if lx.accept(stringEnd) {
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.emit(itemMultilineString)
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.ignore()
 | 
			
		||||
				return lx.pop()
 | 
			
		||||
			}
 | 
			
		||||
			lx.backup()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return lexMultilineString
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexRawString consumes a raw string. Nothing can be escaped in such a string.
 | 
			
		||||
// It assumes that the beginning "'" has already been consumed and ignored.
 | 
			
		||||
func lexRawString(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch {
 | 
			
		||||
	case r == eof:
 | 
			
		||||
		return lx.errorf("unexpected EOF")
 | 
			
		||||
	case isNL(r):
 | 
			
		||||
		return lx.errorf("strings cannot contain newlines")
 | 
			
		||||
	case r == rawStringEnd:
 | 
			
		||||
		lx.backup()
 | 
			
		||||
		lx.emit(itemRawString)
 | 
			
		||||
		lx.next()
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	}
 | 
			
		||||
	return lexRawString
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexMultilineRawString consumes a raw string. Nothing can be escaped in such
 | 
			
		||||
// a string. It assumes that the beginning "'''" has already been consumed and
 | 
			
		||||
// ignored.
 | 
			
		||||
func lexMultilineRawString(lx *lexer) stateFn {
 | 
			
		||||
	switch lx.next() {
 | 
			
		||||
	case eof:
 | 
			
		||||
		return lx.errorf("unexpected EOF")
 | 
			
		||||
	case rawStringEnd:
 | 
			
		||||
		if lx.accept(rawStringEnd) {
 | 
			
		||||
			if lx.accept(rawStringEnd) {
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.backup()
 | 
			
		||||
				lx.emit(itemRawMultilineString)
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.next()
 | 
			
		||||
				lx.ignore()
 | 
			
		||||
				return lx.pop()
 | 
			
		||||
			}
 | 
			
		||||
			lx.backup()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return lexMultilineRawString
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexMultilineStringEscape consumes an escaped character. It assumes that the
 | 
			
		||||
// preceding '\\' has already been consumed.
 | 
			
		||||
func lexMultilineStringEscape(lx *lexer) stateFn {
 | 
			
		||||
	// Handle the special case first:
 | 
			
		||||
	if isNL(lx.next()) {
 | 
			
		||||
		return lexMultilineString
 | 
			
		||||
	}
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.push(lexMultilineString)
 | 
			
		||||
	return lexStringEscape(lx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexStringEscape(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	switch r {
 | 
			
		||||
	case 'b':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case 't':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case 'n':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case 'f':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case 'r':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case '"':
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case '\\':
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	case 'u':
 | 
			
		||||
		return lexShortUnicodeEscape
 | 
			
		||||
	case 'U':
 | 
			
		||||
		return lexLongUnicodeEscape
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("invalid escape character %q; only the following "+
 | 
			
		||||
		"escape characters are allowed: "+
 | 
			
		||||
		`\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexShortUnicodeEscape(lx *lexer) stateFn {
 | 
			
		||||
	var r rune
 | 
			
		||||
	for i := 0; i < 4; i++ {
 | 
			
		||||
		r = lx.next()
 | 
			
		||||
		if !isHexadecimal(r) {
 | 
			
		||||
			return lx.errorf(`expected four hexadecimal digits after '\u', `+
 | 
			
		||||
				"but got %q instead", lx.current())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lexLongUnicodeEscape(lx *lexer) stateFn {
 | 
			
		||||
	var r rune
 | 
			
		||||
	for i := 0; i < 8; i++ {
 | 
			
		||||
		r = lx.next()
 | 
			
		||||
		if !isHexadecimal(r) {
 | 
			
		||||
			return lx.errorf(`expected eight hexadecimal digits after '\U', `+
 | 
			
		||||
				"but got %q instead", lx.current())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexNumberOrDateStart consumes either an integer, a float, or datetime.
 | 
			
		||||
func lexNumberOrDateStart(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isDigit(r) {
 | 
			
		||||
		return lexNumberOrDate
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case '_':
 | 
			
		||||
		return lexNumber
 | 
			
		||||
	case 'e', 'E':
 | 
			
		||||
		return lexFloat
 | 
			
		||||
	case '.':
 | 
			
		||||
		return lx.errorf("floats must start with a digit, not '.'")
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("expected a digit but got %q", r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexNumberOrDate consumes either an integer, float or datetime.
 | 
			
		||||
func lexNumberOrDate(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isDigit(r) {
 | 
			
		||||
		return lexNumberOrDate
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case '-':
 | 
			
		||||
		return lexDatetime
 | 
			
		||||
	case '_':
 | 
			
		||||
		return lexNumber
 | 
			
		||||
	case '.', 'e', 'E':
 | 
			
		||||
		return lexFloat
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.emit(itemInteger)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexDatetime consumes a Datetime, to a first approximation.
 | 
			
		||||
// The parser validates that it matches one of the accepted formats.
 | 
			
		||||
func lexDatetime(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isDigit(r) {
 | 
			
		||||
		return lexDatetime
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case '-', 'T', ':', '.', 'Z', '+':
 | 
			
		||||
		return lexDatetime
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.emit(itemDatetime)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexNumberStart consumes either an integer or a float. It assumes that a sign
 | 
			
		||||
// has already been read, but that *no* digits have been consumed.
 | 
			
		||||
// lexNumberStart will move to the appropriate integer or float states.
 | 
			
		||||
func lexNumberStart(lx *lexer) stateFn {
 | 
			
		||||
	// We MUST see a digit. Even floats have to start with a digit.
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if !isDigit(r) {
 | 
			
		||||
		if r == '.' {
 | 
			
		||||
			return lx.errorf("floats must start with a digit, not '.'")
 | 
			
		||||
		}
 | 
			
		||||
		return lx.errorf("expected a digit but got %q", r)
 | 
			
		||||
	}
 | 
			
		||||
	return lexNumber
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexNumber consumes an integer or a float after seeing the first digit.
 | 
			
		||||
func lexNumber(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isDigit(r) {
 | 
			
		||||
		return lexNumber
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case '_':
 | 
			
		||||
		return lexNumber
 | 
			
		||||
	case '.', 'e', 'E':
 | 
			
		||||
		return lexFloat
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.emit(itemInteger)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexFloat consumes the elements of a float. It allows any sequence of
 | 
			
		||||
// float-like characters, so floats emitted by the lexer are only a first
 | 
			
		||||
// approximation and must be validated by the parser.
 | 
			
		||||
func lexFloat(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.next()
 | 
			
		||||
	if isDigit(r) {
 | 
			
		||||
		return lexFloat
 | 
			
		||||
	}
 | 
			
		||||
	switch r {
 | 
			
		||||
	case '_', '.', '-', '+', 'e', 'E':
 | 
			
		||||
		return lexFloat
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lx.backup()
 | 
			
		||||
	lx.emit(itemFloat)
 | 
			
		||||
	return lx.pop()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexBool consumes a bool string: 'true' or 'false.
 | 
			
		||||
func lexBool(lx *lexer) stateFn {
 | 
			
		||||
	var rs []rune
 | 
			
		||||
	for {
 | 
			
		||||
		r := lx.next()
 | 
			
		||||
		if !unicode.IsLetter(r) {
 | 
			
		||||
			lx.backup()
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		rs = append(rs, r)
 | 
			
		||||
	}
 | 
			
		||||
	s := string(rs)
 | 
			
		||||
	switch s {
 | 
			
		||||
	case "true", "false":
 | 
			
		||||
		lx.emit(itemBool)
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	}
 | 
			
		||||
	return lx.errorf("expected value but found %q instead", s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexCommentStart begins the lexing of a comment. It will emit
 | 
			
		||||
// itemCommentStart and consume no characters, passing control to lexComment.
 | 
			
		||||
func lexCommentStart(lx *lexer) stateFn {
 | 
			
		||||
	lx.ignore()
 | 
			
		||||
	lx.emit(itemCommentStart)
 | 
			
		||||
	return lexComment
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexComment lexes an entire comment. It assumes that '#' has been consumed.
 | 
			
		||||
// It will consume *up to* the first newline character, and pass control
 | 
			
		||||
// back to the last state on the stack.
 | 
			
		||||
func lexComment(lx *lexer) stateFn {
 | 
			
		||||
	r := lx.peek()
 | 
			
		||||
	if isNL(r) || r == eof {
 | 
			
		||||
		lx.emit(itemText)
 | 
			
		||||
		return lx.pop()
 | 
			
		||||
	}
 | 
			
		||||
	lx.next()
 | 
			
		||||
	return lexComment
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lexSkip ignores all slurped input and moves on to the next state.
 | 
			
		||||
func lexSkip(lx *lexer, nextState stateFn) stateFn {
 | 
			
		||||
	return func(lx *lexer) stateFn {
 | 
			
		||||
		lx.ignore()
 | 
			
		||||
		return nextState
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isWhitespace returns true if `r` is a whitespace character according
 | 
			
		||||
// to the spec.
 | 
			
		||||
func isWhitespace(r rune) bool {
 | 
			
		||||
	return r == '\t' || r == ' '
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isNL(r rune) bool {
 | 
			
		||||
	return r == '\n' || r == '\r'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isDigit(r rune) bool {
 | 
			
		||||
	return r >= '0' && r <= '9'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isHexadecimal(r rune) bool {
 | 
			
		||||
	return (r >= '0' && r <= '9') ||
 | 
			
		||||
		(r >= 'a' && r <= 'f') ||
 | 
			
		||||
		(r >= 'A' && r <= 'F')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isBareKeyChar(r rune) bool {
 | 
			
		||||
	return (r >= 'A' && r <= 'Z') ||
 | 
			
		||||
		(r >= 'a' && r <= 'z') ||
 | 
			
		||||
		(r >= '0' && r <= '9') ||
 | 
			
		||||
		r == '_' ||
 | 
			
		||||
		r == '-'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (itype itemType) String() string {
 | 
			
		||||
	switch itype {
 | 
			
		||||
	case itemError:
 | 
			
		||||
		return "Error"
 | 
			
		||||
	case itemNIL:
 | 
			
		||||
		return "NIL"
 | 
			
		||||
	case itemEOF:
 | 
			
		||||
		return "EOF"
 | 
			
		||||
	case itemText:
 | 
			
		||||
		return "Text"
 | 
			
		||||
	case itemString, itemRawString, itemMultilineString, itemRawMultilineString:
 | 
			
		||||
		return "String"
 | 
			
		||||
	case itemBool:
 | 
			
		||||
		return "Bool"
 | 
			
		||||
	case itemInteger:
 | 
			
		||||
		return "Integer"
 | 
			
		||||
	case itemFloat:
 | 
			
		||||
		return "Float"
 | 
			
		||||
	case itemDatetime:
 | 
			
		||||
		return "DateTime"
 | 
			
		||||
	case itemTableStart:
 | 
			
		||||
		return "TableStart"
 | 
			
		||||
	case itemTableEnd:
 | 
			
		||||
		return "TableEnd"
 | 
			
		||||
	case itemKeyStart:
 | 
			
		||||
		return "KeyStart"
 | 
			
		||||
	case itemArray:
 | 
			
		||||
		return "Array"
 | 
			
		||||
	case itemArrayEnd:
 | 
			
		||||
		return "ArrayEnd"
 | 
			
		||||
	case itemCommentStart:
 | 
			
		||||
		return "CommentStart"
 | 
			
		||||
	}
 | 
			
		||||
	panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (item item) String() string {
 | 
			
		||||
	return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										592
									
								
								vendor/github.com/BurntSushi/toml/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										592
									
								
								vendor/github.com/BurntSushi/toml/parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,592 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unicode"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type parser struct {
 | 
			
		||||
	mapping map[string]interface{}
 | 
			
		||||
	types   map[string]tomlType
 | 
			
		||||
	lx      *lexer
 | 
			
		||||
 | 
			
		||||
	// A list of keys in the order that they appear in the TOML data.
 | 
			
		||||
	ordered []Key
 | 
			
		||||
 | 
			
		||||
	// the full key for the current hash in scope
 | 
			
		||||
	context Key
 | 
			
		||||
 | 
			
		||||
	// the base key name for everything except hashes
 | 
			
		||||
	currentKey string
 | 
			
		||||
 | 
			
		||||
	// rough approximation of line number
 | 
			
		||||
	approxLine int
 | 
			
		||||
 | 
			
		||||
	// A map of 'key.group.names' to whether they were created implicitly.
 | 
			
		||||
	implicits map[string]bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type parseError string
 | 
			
		||||
 | 
			
		||||
func (pe parseError) Error() string {
 | 
			
		||||
	return string(pe)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parse(data string) (p *parser, err error) {
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if r := recover(); r != nil {
 | 
			
		||||
			var ok bool
 | 
			
		||||
			if err, ok = r.(parseError); ok {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			panic(r)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	p = &parser{
 | 
			
		||||
		mapping:   make(map[string]interface{}),
 | 
			
		||||
		types:     make(map[string]tomlType),
 | 
			
		||||
		lx:        lex(data),
 | 
			
		||||
		ordered:   make([]Key, 0),
 | 
			
		||||
		implicits: make(map[string]bool),
 | 
			
		||||
	}
 | 
			
		||||
	for {
 | 
			
		||||
		item := p.next()
 | 
			
		||||
		if item.typ == itemEOF {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		p.topLevel(item)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return p, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) panicf(format string, v ...interface{}) {
 | 
			
		||||
	msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s",
 | 
			
		||||
		p.approxLine, p.current(), fmt.Sprintf(format, v...))
 | 
			
		||||
	panic(parseError(msg))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) next() item {
 | 
			
		||||
	it := p.lx.nextItem()
 | 
			
		||||
	if it.typ == itemError {
 | 
			
		||||
		p.panicf("%s", it.val)
 | 
			
		||||
	}
 | 
			
		||||
	return it
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) bug(format string, v ...interface{}) {
 | 
			
		||||
	panic(fmt.Sprintf("BUG: "+format+"\n\n", v...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) expect(typ itemType) item {
 | 
			
		||||
	it := p.next()
 | 
			
		||||
	p.assertEqual(typ, it.typ)
 | 
			
		||||
	return it
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) assertEqual(expected, got itemType) {
 | 
			
		||||
	if expected != got {
 | 
			
		||||
		p.bug("Expected '%s' but got '%s'.", expected, got)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) topLevel(item item) {
 | 
			
		||||
	switch item.typ {
 | 
			
		||||
	case itemCommentStart:
 | 
			
		||||
		p.approxLine = item.line
 | 
			
		||||
		p.expect(itemText)
 | 
			
		||||
	case itemTableStart:
 | 
			
		||||
		kg := p.next()
 | 
			
		||||
		p.approxLine = kg.line
 | 
			
		||||
 | 
			
		||||
		var key Key
 | 
			
		||||
		for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() {
 | 
			
		||||
			key = append(key, p.keyString(kg))
 | 
			
		||||
		}
 | 
			
		||||
		p.assertEqual(itemTableEnd, kg.typ)
 | 
			
		||||
 | 
			
		||||
		p.establishContext(key, false)
 | 
			
		||||
		p.setType("", tomlHash)
 | 
			
		||||
		p.ordered = append(p.ordered, key)
 | 
			
		||||
	case itemArrayTableStart:
 | 
			
		||||
		kg := p.next()
 | 
			
		||||
		p.approxLine = kg.line
 | 
			
		||||
 | 
			
		||||
		var key Key
 | 
			
		||||
		for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() {
 | 
			
		||||
			key = append(key, p.keyString(kg))
 | 
			
		||||
		}
 | 
			
		||||
		p.assertEqual(itemArrayTableEnd, kg.typ)
 | 
			
		||||
 | 
			
		||||
		p.establishContext(key, true)
 | 
			
		||||
		p.setType("", tomlArrayHash)
 | 
			
		||||
		p.ordered = append(p.ordered, key)
 | 
			
		||||
	case itemKeyStart:
 | 
			
		||||
		kname := p.next()
 | 
			
		||||
		p.approxLine = kname.line
 | 
			
		||||
		p.currentKey = p.keyString(kname)
 | 
			
		||||
 | 
			
		||||
		val, typ := p.value(p.next())
 | 
			
		||||
		p.setValue(p.currentKey, val)
 | 
			
		||||
		p.setType(p.currentKey, typ)
 | 
			
		||||
		p.ordered = append(p.ordered, p.context.add(p.currentKey))
 | 
			
		||||
		p.currentKey = ""
 | 
			
		||||
	default:
 | 
			
		||||
		p.bug("Unexpected type at top level: %s", item.typ)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets a string for a key (or part of a key in a table name).
 | 
			
		||||
func (p *parser) keyString(it item) string {
 | 
			
		||||
	switch it.typ {
 | 
			
		||||
	case itemText:
 | 
			
		||||
		return it.val
 | 
			
		||||
	case itemString, itemMultilineString,
 | 
			
		||||
		itemRawString, itemRawMultilineString:
 | 
			
		||||
		s, _ := p.value(it)
 | 
			
		||||
		return s.(string)
 | 
			
		||||
	default:
 | 
			
		||||
		p.bug("Unexpected key type: %s", it.typ)
 | 
			
		||||
		panic("unreachable")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// value translates an expected value from the lexer into a Go value wrapped
 | 
			
		||||
// as an empty interface.
 | 
			
		||||
func (p *parser) value(it item) (interface{}, tomlType) {
 | 
			
		||||
	switch it.typ {
 | 
			
		||||
	case itemString:
 | 
			
		||||
		return p.replaceEscapes(it.val), p.typeOfPrimitive(it)
 | 
			
		||||
	case itemMultilineString:
 | 
			
		||||
		trimmed := stripFirstNewline(stripEscapedWhitespace(it.val))
 | 
			
		||||
		return p.replaceEscapes(trimmed), p.typeOfPrimitive(it)
 | 
			
		||||
	case itemRawString:
 | 
			
		||||
		return it.val, p.typeOfPrimitive(it)
 | 
			
		||||
	case itemRawMultilineString:
 | 
			
		||||
		return stripFirstNewline(it.val), p.typeOfPrimitive(it)
 | 
			
		||||
	case itemBool:
 | 
			
		||||
		switch it.val {
 | 
			
		||||
		case "true":
 | 
			
		||||
			return true, p.typeOfPrimitive(it)
 | 
			
		||||
		case "false":
 | 
			
		||||
			return false, p.typeOfPrimitive(it)
 | 
			
		||||
		}
 | 
			
		||||
		p.bug("Expected boolean value, but got '%s'.", it.val)
 | 
			
		||||
	case itemInteger:
 | 
			
		||||
		if !numUnderscoresOK(it.val) {
 | 
			
		||||
			p.panicf("Invalid integer %q: underscores must be surrounded by digits",
 | 
			
		||||
				it.val)
 | 
			
		||||
		}
 | 
			
		||||
		val := strings.Replace(it.val, "_", "", -1)
 | 
			
		||||
		num, err := strconv.ParseInt(val, 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// Distinguish integer values. Normally, it'd be a bug if the lexer
 | 
			
		||||
			// provides an invalid integer, but it's possible that the number is
 | 
			
		||||
			// out of range of valid values (which the lexer cannot determine).
 | 
			
		||||
			// So mark the former as a bug but the latter as a legitimate user
 | 
			
		||||
			// error.
 | 
			
		||||
			if e, ok := err.(*strconv.NumError); ok &&
 | 
			
		||||
				e.Err == strconv.ErrRange {
 | 
			
		||||
 | 
			
		||||
				p.panicf("Integer '%s' is out of the range of 64-bit "+
 | 
			
		||||
					"signed integers.", it.val)
 | 
			
		||||
			} else {
 | 
			
		||||
				p.bug("Expected integer value, but got '%s'.", it.val)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return num, p.typeOfPrimitive(it)
 | 
			
		||||
	case itemFloat:
 | 
			
		||||
		parts := strings.FieldsFunc(it.val, func(r rune) bool {
 | 
			
		||||
			switch r {
 | 
			
		||||
			case '.', 'e', 'E':
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			return false
 | 
			
		||||
		})
 | 
			
		||||
		for _, part := range parts {
 | 
			
		||||
			if !numUnderscoresOK(part) {
 | 
			
		||||
				p.panicf("Invalid float %q: underscores must be "+
 | 
			
		||||
					"surrounded by digits", it.val)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if !numPeriodsOK(it.val) {
 | 
			
		||||
			// As a special case, numbers like '123.' or '1.e2',
 | 
			
		||||
			// which are valid as far as Go/strconv are concerned,
 | 
			
		||||
			// must be rejected because TOML says that a fractional
 | 
			
		||||
			// part consists of '.' followed by 1+ digits.
 | 
			
		||||
			p.panicf("Invalid float %q: '.' must be followed "+
 | 
			
		||||
				"by one or more digits", it.val)
 | 
			
		||||
		}
 | 
			
		||||
		val := strings.Replace(it.val, "_", "", -1)
 | 
			
		||||
		num, err := strconv.ParseFloat(val, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if e, ok := err.(*strconv.NumError); ok &&
 | 
			
		||||
				e.Err == strconv.ErrRange {
 | 
			
		||||
 | 
			
		||||
				p.panicf("Float '%s' is out of the range of 64-bit "+
 | 
			
		||||
					"IEEE-754 floating-point numbers.", it.val)
 | 
			
		||||
			} else {
 | 
			
		||||
				p.panicf("Invalid float value: %q", it.val)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return num, p.typeOfPrimitive(it)
 | 
			
		||||
	case itemDatetime:
 | 
			
		||||
		var t time.Time
 | 
			
		||||
		var ok bool
 | 
			
		||||
		var err error
 | 
			
		||||
		for _, format := range []string{
 | 
			
		||||
			"2006-01-02T15:04:05Z07:00",
 | 
			
		||||
			"2006-01-02T15:04:05",
 | 
			
		||||
			"2006-01-02",
 | 
			
		||||
		} {
 | 
			
		||||
			t, err = time.ParseInLocation(format, it.val, time.Local)
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				ok = true
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if !ok {
 | 
			
		||||
			p.panicf("Invalid TOML Datetime: %q.", it.val)
 | 
			
		||||
		}
 | 
			
		||||
		return t, p.typeOfPrimitive(it)
 | 
			
		||||
	case itemArray:
 | 
			
		||||
		array := make([]interface{}, 0)
 | 
			
		||||
		types := make([]tomlType, 0)
 | 
			
		||||
 | 
			
		||||
		for it = p.next(); it.typ != itemArrayEnd; it = p.next() {
 | 
			
		||||
			if it.typ == itemCommentStart {
 | 
			
		||||
				p.expect(itemText)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			val, typ := p.value(it)
 | 
			
		||||
			array = append(array, val)
 | 
			
		||||
			types = append(types, typ)
 | 
			
		||||
		}
 | 
			
		||||
		return array, p.typeOfArray(types)
 | 
			
		||||
	case itemInlineTableStart:
 | 
			
		||||
		var (
 | 
			
		||||
			hash         = make(map[string]interface{})
 | 
			
		||||
			outerContext = p.context
 | 
			
		||||
			outerKey     = p.currentKey
 | 
			
		||||
		)
 | 
			
		||||
 | 
			
		||||
		p.context = append(p.context, p.currentKey)
 | 
			
		||||
		p.currentKey = ""
 | 
			
		||||
		for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() {
 | 
			
		||||
			if it.typ != itemKeyStart {
 | 
			
		||||
				p.bug("Expected key start but instead found %q, around line %d",
 | 
			
		||||
					it.val, p.approxLine)
 | 
			
		||||
			}
 | 
			
		||||
			if it.typ == itemCommentStart {
 | 
			
		||||
				p.expect(itemText)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// retrieve key
 | 
			
		||||
			k := p.next()
 | 
			
		||||
			p.approxLine = k.line
 | 
			
		||||
			kname := p.keyString(k)
 | 
			
		||||
 | 
			
		||||
			// retrieve value
 | 
			
		||||
			p.currentKey = kname
 | 
			
		||||
			val, typ := p.value(p.next())
 | 
			
		||||
			// make sure we keep metadata up to date
 | 
			
		||||
			p.setType(kname, typ)
 | 
			
		||||
			p.ordered = append(p.ordered, p.context.add(p.currentKey))
 | 
			
		||||
			hash[kname] = val
 | 
			
		||||
		}
 | 
			
		||||
		p.context = outerContext
 | 
			
		||||
		p.currentKey = outerKey
 | 
			
		||||
		return hash, tomlHash
 | 
			
		||||
	}
 | 
			
		||||
	p.bug("Unexpected value type: %s", it.typ)
 | 
			
		||||
	panic("unreachable")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// numUnderscoresOK checks whether each underscore in s is surrounded by
 | 
			
		||||
// characters that are not underscores.
 | 
			
		||||
func numUnderscoresOK(s string) bool {
 | 
			
		||||
	accept := false
 | 
			
		||||
	for _, r := range s {
 | 
			
		||||
		if r == '_' {
 | 
			
		||||
			if !accept {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			accept = false
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		accept = true
 | 
			
		||||
	}
 | 
			
		||||
	return accept
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// numPeriodsOK checks whether every period in s is followed by a digit.
 | 
			
		||||
func numPeriodsOK(s string) bool {
 | 
			
		||||
	period := false
 | 
			
		||||
	for _, r := range s {
 | 
			
		||||
		if period && !isDigit(r) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		period = r == '.'
 | 
			
		||||
	}
 | 
			
		||||
	return !period
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// establishContext sets the current context of the parser,
 | 
			
		||||
// where the context is either a hash or an array of hashes. Which one is
 | 
			
		||||
// set depends on the value of the `array` parameter.
 | 
			
		||||
//
 | 
			
		||||
// Establishing the context also makes sure that the key isn't a duplicate, and
 | 
			
		||||
// will create implicit hashes automatically.
 | 
			
		||||
func (p *parser) establishContext(key Key, array bool) {
 | 
			
		||||
	var ok bool
 | 
			
		||||
 | 
			
		||||
	// Always start at the top level and drill down for our context.
 | 
			
		||||
	hashContext := p.mapping
 | 
			
		||||
	keyContext := make(Key, 0)
 | 
			
		||||
 | 
			
		||||
	// We only need implicit hashes for key[0:-1]
 | 
			
		||||
	for _, k := range key[0 : len(key)-1] {
 | 
			
		||||
		_, ok = hashContext[k]
 | 
			
		||||
		keyContext = append(keyContext, k)
 | 
			
		||||
 | 
			
		||||
		// No key? Make an implicit hash and move on.
 | 
			
		||||
		if !ok {
 | 
			
		||||
			p.addImplicit(keyContext)
 | 
			
		||||
			hashContext[k] = make(map[string]interface{})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// If the hash context is actually an array of tables, then set
 | 
			
		||||
		// the hash context to the last element in that array.
 | 
			
		||||
		//
 | 
			
		||||
		// Otherwise, it better be a table, since this MUST be a key group (by
 | 
			
		||||
		// virtue of it not being the last element in a key).
 | 
			
		||||
		switch t := hashContext[k].(type) {
 | 
			
		||||
		case []map[string]interface{}:
 | 
			
		||||
			hashContext = t[len(t)-1]
 | 
			
		||||
		case map[string]interface{}:
 | 
			
		||||
			hashContext = t
 | 
			
		||||
		default:
 | 
			
		||||
			p.panicf("Key '%s' was already created as a hash.", keyContext)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p.context = keyContext
 | 
			
		||||
	if array {
 | 
			
		||||
		// If this is the first element for this array, then allocate a new
 | 
			
		||||
		// list of tables for it.
 | 
			
		||||
		k := key[len(key)-1]
 | 
			
		||||
		if _, ok := hashContext[k]; !ok {
 | 
			
		||||
			hashContext[k] = make([]map[string]interface{}, 0, 5)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Add a new table. But make sure the key hasn't already been used
 | 
			
		||||
		// for something else.
 | 
			
		||||
		if hash, ok := hashContext[k].([]map[string]interface{}); ok {
 | 
			
		||||
			hashContext[k] = append(hash, make(map[string]interface{}))
 | 
			
		||||
		} else {
 | 
			
		||||
			p.panicf("Key '%s' was already created and cannot be used as "+
 | 
			
		||||
				"an array.", keyContext)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		p.setValue(key[len(key)-1], make(map[string]interface{}))
 | 
			
		||||
	}
 | 
			
		||||
	p.context = append(p.context, key[len(key)-1])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setValue sets the given key to the given value in the current context.
 | 
			
		||||
// It will make sure that the key hasn't already been defined, account for
 | 
			
		||||
// implicit key groups.
 | 
			
		||||
func (p *parser) setValue(key string, value interface{}) {
 | 
			
		||||
	var tmpHash interface{}
 | 
			
		||||
	var ok bool
 | 
			
		||||
 | 
			
		||||
	hash := p.mapping
 | 
			
		||||
	keyContext := make(Key, 0)
 | 
			
		||||
	for _, k := range p.context {
 | 
			
		||||
		keyContext = append(keyContext, k)
 | 
			
		||||
		if tmpHash, ok = hash[k]; !ok {
 | 
			
		||||
			p.bug("Context for key '%s' has not been established.", keyContext)
 | 
			
		||||
		}
 | 
			
		||||
		switch t := tmpHash.(type) {
 | 
			
		||||
		case []map[string]interface{}:
 | 
			
		||||
			// The context is a table of hashes. Pick the most recent table
 | 
			
		||||
			// defined as the current hash.
 | 
			
		||||
			hash = t[len(t)-1]
 | 
			
		||||
		case map[string]interface{}:
 | 
			
		||||
			hash = t
 | 
			
		||||
		default:
 | 
			
		||||
			p.bug("Expected hash to have type 'map[string]interface{}', but "+
 | 
			
		||||
				"it has '%T' instead.", tmpHash)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	keyContext = append(keyContext, key)
 | 
			
		||||
 | 
			
		||||
	if _, ok := hash[key]; ok {
 | 
			
		||||
		// Typically, if the given key has already been set, then we have
 | 
			
		||||
		// to raise an error since duplicate keys are disallowed. However,
 | 
			
		||||
		// it's possible that a key was previously defined implicitly. In this
 | 
			
		||||
		// case, it is allowed to be redefined concretely. (See the
 | 
			
		||||
		// `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.)
 | 
			
		||||
		//
 | 
			
		||||
		// But we have to make sure to stop marking it as an implicit. (So that
 | 
			
		||||
		// another redefinition provokes an error.)
 | 
			
		||||
		//
 | 
			
		||||
		// Note that since it has already been defined (as a hash), we don't
 | 
			
		||||
		// want to overwrite it. So our business is done.
 | 
			
		||||
		if p.isImplicit(keyContext) {
 | 
			
		||||
			p.removeImplicit(keyContext)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Otherwise, we have a concrete key trying to override a previous
 | 
			
		||||
		// key, which is *always* wrong.
 | 
			
		||||
		p.panicf("Key '%s' has already been defined.", keyContext)
 | 
			
		||||
	}
 | 
			
		||||
	hash[key] = value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setType sets the type of a particular value at a given key.
 | 
			
		||||
// It should be called immediately AFTER setValue.
 | 
			
		||||
//
 | 
			
		||||
// Note that if `key` is empty, then the type given will be applied to the
 | 
			
		||||
// current context (which is either a table or an array of tables).
 | 
			
		||||
func (p *parser) setType(key string, typ tomlType) {
 | 
			
		||||
	keyContext := make(Key, 0, len(p.context)+1)
 | 
			
		||||
	for _, k := range p.context {
 | 
			
		||||
		keyContext = append(keyContext, k)
 | 
			
		||||
	}
 | 
			
		||||
	if len(key) > 0 { // allow type setting for hashes
 | 
			
		||||
		keyContext = append(keyContext, key)
 | 
			
		||||
	}
 | 
			
		||||
	p.types[keyContext.String()] = typ
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addImplicit sets the given Key as having been created implicitly.
 | 
			
		||||
func (p *parser) addImplicit(key Key) {
 | 
			
		||||
	p.implicits[key.String()] = true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// removeImplicit stops tagging the given key as having been implicitly
 | 
			
		||||
// created.
 | 
			
		||||
func (p *parser) removeImplicit(key Key) {
 | 
			
		||||
	p.implicits[key.String()] = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isImplicit returns true if the key group pointed to by the key was created
 | 
			
		||||
// implicitly.
 | 
			
		||||
func (p *parser) isImplicit(key Key) bool {
 | 
			
		||||
	return p.implicits[key.String()]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// current returns the full key name of the current context.
 | 
			
		||||
func (p *parser) current() string {
 | 
			
		||||
	if len(p.currentKey) == 0 {
 | 
			
		||||
		return p.context.String()
 | 
			
		||||
	}
 | 
			
		||||
	if len(p.context) == 0 {
 | 
			
		||||
		return p.currentKey
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%s.%s", p.context, p.currentKey)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func stripFirstNewline(s string) string {
 | 
			
		||||
	if len(s) == 0 || s[0] != '\n' {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
	return s[1:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func stripEscapedWhitespace(s string) string {
 | 
			
		||||
	esc := strings.Split(s, "\\\n")
 | 
			
		||||
	if len(esc) > 1 {
 | 
			
		||||
		for i := 1; i < len(esc); i++ {
 | 
			
		||||
			esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(esc, "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) replaceEscapes(str string) string {
 | 
			
		||||
	var replaced []rune
 | 
			
		||||
	s := []byte(str)
 | 
			
		||||
	r := 0
 | 
			
		||||
	for r < len(s) {
 | 
			
		||||
		if s[r] != '\\' {
 | 
			
		||||
			c, size := utf8.DecodeRune(s[r:])
 | 
			
		||||
			r += size
 | 
			
		||||
			replaced = append(replaced, c)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		r += 1
 | 
			
		||||
		if r >= len(s) {
 | 
			
		||||
			p.bug("Escape sequence at end of string.")
 | 
			
		||||
			return ""
 | 
			
		||||
		}
 | 
			
		||||
		switch s[r] {
 | 
			
		||||
		default:
 | 
			
		||||
			p.bug("Expected valid escape code after \\, but got %q.", s[r])
 | 
			
		||||
			return ""
 | 
			
		||||
		case 'b':
 | 
			
		||||
			replaced = append(replaced, rune(0x0008))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case 't':
 | 
			
		||||
			replaced = append(replaced, rune(0x0009))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case 'n':
 | 
			
		||||
			replaced = append(replaced, rune(0x000A))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case 'f':
 | 
			
		||||
			replaced = append(replaced, rune(0x000C))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case 'r':
 | 
			
		||||
			replaced = append(replaced, rune(0x000D))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case '"':
 | 
			
		||||
			replaced = append(replaced, rune(0x0022))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case '\\':
 | 
			
		||||
			replaced = append(replaced, rune(0x005C))
 | 
			
		||||
			r += 1
 | 
			
		||||
		case 'u':
 | 
			
		||||
			// At this point, we know we have a Unicode escape of the form
 | 
			
		||||
			// `uXXXX` at [r, r+5). (Because the lexer guarantees this
 | 
			
		||||
			// for us.)
 | 
			
		||||
			escaped := p.asciiEscapeToUnicode(s[r+1 : r+5])
 | 
			
		||||
			replaced = append(replaced, escaped)
 | 
			
		||||
			r += 5
 | 
			
		||||
		case 'U':
 | 
			
		||||
			// At this point, we know we have a Unicode escape of the form
 | 
			
		||||
			// `uXXXX` at [r, r+9). (Because the lexer guarantees this
 | 
			
		||||
			// for us.)
 | 
			
		||||
			escaped := p.asciiEscapeToUnicode(s[r+1 : r+9])
 | 
			
		||||
			replaced = append(replaced, escaped)
 | 
			
		||||
			r += 9
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return string(replaced)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *parser) asciiEscapeToUnicode(bs []byte) rune {
 | 
			
		||||
	s := string(bs)
 | 
			
		||||
	hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		p.bug("Could not parse '%s' as a hexadecimal number, but the "+
 | 
			
		||||
			"lexer claims it's OK: %s", s, err)
 | 
			
		||||
	}
 | 
			
		||||
	if !utf8.ValidRune(rune(hex)) {
 | 
			
		||||
		p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s)
 | 
			
		||||
	}
 | 
			
		||||
	return rune(hex)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isStringType(ty itemType) bool {
 | 
			
		||||
	return ty == itemString || ty == itemMultilineString ||
 | 
			
		||||
		ty == itemRawString || ty == itemRawMultilineString
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/BurntSushi/toml/session.vim
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/BurntSushi/toml/session.vim
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
au BufWritePost *.go silent!make tags > /dev/null 2>&1
 | 
			
		||||
							
								
								
									
										91
									
								
								vendor/github.com/BurntSushi/toml/type_check.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/BurntSushi/toml/type_check.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,91 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
// tomlType represents any Go type that corresponds to a TOML type.
 | 
			
		||||
// While the first draft of the TOML spec has a simplistic type system that
 | 
			
		||||
// probably doesn't need this level of sophistication, we seem to be militating
 | 
			
		||||
// toward adding real composite types.
 | 
			
		||||
type tomlType interface {
 | 
			
		||||
	typeString() string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// typeEqual accepts any two types and returns true if they are equal.
 | 
			
		||||
func typeEqual(t1, t2 tomlType) bool {
 | 
			
		||||
	if t1 == nil || t2 == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return t1.typeString() == t2.typeString()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func typeIsHash(t tomlType) bool {
 | 
			
		||||
	return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type tomlBaseType string
 | 
			
		||||
 | 
			
		||||
func (btype tomlBaseType) typeString() string {
 | 
			
		||||
	return string(btype)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (btype tomlBaseType) String() string {
 | 
			
		||||
	return btype.typeString()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	tomlInteger   tomlBaseType = "Integer"
 | 
			
		||||
	tomlFloat     tomlBaseType = "Float"
 | 
			
		||||
	tomlDatetime  tomlBaseType = "Datetime"
 | 
			
		||||
	tomlString    tomlBaseType = "String"
 | 
			
		||||
	tomlBool      tomlBaseType = "Bool"
 | 
			
		||||
	tomlArray     tomlBaseType = "Array"
 | 
			
		||||
	tomlHash      tomlBaseType = "Hash"
 | 
			
		||||
	tomlArrayHash tomlBaseType = "ArrayHash"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// typeOfPrimitive returns a tomlType of any primitive value in TOML.
 | 
			
		||||
// Primitive values are: Integer, Float, Datetime, String and Bool.
 | 
			
		||||
//
 | 
			
		||||
// Passing a lexer item other than the following will cause a BUG message
 | 
			
		||||
// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime.
 | 
			
		||||
func (p *parser) typeOfPrimitive(lexItem item) tomlType {
 | 
			
		||||
	switch lexItem.typ {
 | 
			
		||||
	case itemInteger:
 | 
			
		||||
		return tomlInteger
 | 
			
		||||
	case itemFloat:
 | 
			
		||||
		return tomlFloat
 | 
			
		||||
	case itemDatetime:
 | 
			
		||||
		return tomlDatetime
 | 
			
		||||
	case itemString:
 | 
			
		||||
		return tomlString
 | 
			
		||||
	case itemMultilineString:
 | 
			
		||||
		return tomlString
 | 
			
		||||
	case itemRawString:
 | 
			
		||||
		return tomlString
 | 
			
		||||
	case itemRawMultilineString:
 | 
			
		||||
		return tomlString
 | 
			
		||||
	case itemBool:
 | 
			
		||||
		return tomlBool
 | 
			
		||||
	}
 | 
			
		||||
	p.bug("Cannot infer primitive type of lex item '%s'.", lexItem)
 | 
			
		||||
	panic("unreachable")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// typeOfArray returns a tomlType for an array given a list of types of its
 | 
			
		||||
// values.
 | 
			
		||||
//
 | 
			
		||||
// In the current spec, if an array is homogeneous, then its type is always
 | 
			
		||||
// "Array". If the array is not homogeneous, an error is generated.
 | 
			
		||||
func (p *parser) typeOfArray(types []tomlType) tomlType {
 | 
			
		||||
	// Empty arrays are cool.
 | 
			
		||||
	if len(types) == 0 {
 | 
			
		||||
		return tomlArray
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	theType := types[0]
 | 
			
		||||
	for _, t := range types[1:] {
 | 
			
		||||
		if !typeEqual(theType, t) {
 | 
			
		||||
			p.panicf("Array contains values of type '%s' and '%s', but "+
 | 
			
		||||
				"arrays must be homogeneous.", theType, t)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return tomlArray
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										242
									
								
								vendor/github.com/BurntSushi/toml/type_fields.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										242
									
								
								vendor/github.com/BurntSushi/toml/type_fields.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,242 +0,0 @@
 | 
			
		|||
package toml
 | 
			
		||||
 | 
			
		||||
// Struct field handling is adapted from code in encoding/json:
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the Go distribution.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// A field represents a single field found in a struct.
 | 
			
		||||
type field struct {
 | 
			
		||||
	name  string       // the name of the field (`toml` tag included)
 | 
			
		||||
	tag   bool         // whether field has a `toml` tag
 | 
			
		||||
	index []int        // represents the depth of an anonymous field
 | 
			
		||||
	typ   reflect.Type // the type of the field
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// byName sorts field by name, breaking ties with depth,
 | 
			
		||||
// then breaking ties with "name came from toml tag", then
 | 
			
		||||
// breaking ties with index sequence.
 | 
			
		||||
type byName []field
 | 
			
		||||
 | 
			
		||||
func (x byName) Len() int { return len(x) }
 | 
			
		||||
 | 
			
		||||
func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
 | 
			
		||||
 | 
			
		||||
func (x byName) Less(i, j int) bool {
 | 
			
		||||
	if x[i].name != x[j].name {
 | 
			
		||||
		return x[i].name < x[j].name
 | 
			
		||||
	}
 | 
			
		||||
	if len(x[i].index) != len(x[j].index) {
 | 
			
		||||
		return len(x[i].index) < len(x[j].index)
 | 
			
		||||
	}
 | 
			
		||||
	if x[i].tag != x[j].tag {
 | 
			
		||||
		return x[i].tag
 | 
			
		||||
	}
 | 
			
		||||
	return byIndex(x).Less(i, j)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// byIndex sorts field by index sequence.
 | 
			
		||||
type byIndex []field
 | 
			
		||||
 | 
			
		||||
func (x byIndex) Len() int { return len(x) }
 | 
			
		||||
 | 
			
		||||
func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
 | 
			
		||||
 | 
			
		||||
func (x byIndex) Less(i, j int) bool {
 | 
			
		||||
	for k, xik := range x[i].index {
 | 
			
		||||
		if k >= len(x[j].index) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		if xik != x[j].index[k] {
 | 
			
		||||
			return xik < x[j].index[k]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return len(x[i].index) < len(x[j].index)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// typeFields returns a list of fields that TOML should recognize for the given
 | 
			
		||||
// type. The algorithm is breadth-first search over the set of structs to
 | 
			
		||||
// include - the top struct and then any reachable anonymous structs.
 | 
			
		||||
func typeFields(t reflect.Type) []field {
 | 
			
		||||
	// Anonymous fields to explore at the current level and the next.
 | 
			
		||||
	current := []field{}
 | 
			
		||||
	next := []field{{typ: t}}
 | 
			
		||||
 | 
			
		||||
	// Count of queued names for current level and the next.
 | 
			
		||||
	count := map[reflect.Type]int{}
 | 
			
		||||
	nextCount := map[reflect.Type]int{}
 | 
			
		||||
 | 
			
		||||
	// Types already visited at an earlier level.
 | 
			
		||||
	visited := map[reflect.Type]bool{}
 | 
			
		||||
 | 
			
		||||
	// Fields found.
 | 
			
		||||
	var fields []field
 | 
			
		||||
 | 
			
		||||
	for len(next) > 0 {
 | 
			
		||||
		current, next = next, current[:0]
 | 
			
		||||
		count, nextCount = nextCount, map[reflect.Type]int{}
 | 
			
		||||
 | 
			
		||||
		for _, f := range current {
 | 
			
		||||
			if visited[f.typ] {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			visited[f.typ] = true
 | 
			
		||||
 | 
			
		||||
			// Scan f.typ for fields to include.
 | 
			
		||||
			for i := 0; i < f.typ.NumField(); i++ {
 | 
			
		||||
				sf := f.typ.Field(i)
 | 
			
		||||
				if sf.PkgPath != "" && !sf.Anonymous { // unexported
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				opts := getOptions(sf.Tag)
 | 
			
		||||
				if opts.skip {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				index := make([]int, len(f.index)+1)
 | 
			
		||||
				copy(index, f.index)
 | 
			
		||||
				index[len(f.index)] = i
 | 
			
		||||
 | 
			
		||||
				ft := sf.Type
 | 
			
		||||
				if ft.Name() == "" && ft.Kind() == reflect.Ptr {
 | 
			
		||||
					// Follow pointer.
 | 
			
		||||
					ft = ft.Elem()
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Record found field and index sequence.
 | 
			
		||||
				if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
 | 
			
		||||
					tagged := opts.name != ""
 | 
			
		||||
					name := opts.name
 | 
			
		||||
					if name == "" {
 | 
			
		||||
						name = sf.Name
 | 
			
		||||
					}
 | 
			
		||||
					fields = append(fields, field{name, tagged, index, ft})
 | 
			
		||||
					if count[f.typ] > 1 {
 | 
			
		||||
						// If there were multiple instances, add a second,
 | 
			
		||||
						// so that the annihilation code will see a duplicate.
 | 
			
		||||
						// It only cares about the distinction between 1 or 2,
 | 
			
		||||
						// so don't bother generating any more copies.
 | 
			
		||||
						fields = append(fields, fields[len(fields)-1])
 | 
			
		||||
					}
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// Record new anonymous struct to explore in next round.
 | 
			
		||||
				nextCount[ft]++
 | 
			
		||||
				if nextCount[ft] == 1 {
 | 
			
		||||
					f := field{name: ft.Name(), index: index, typ: ft}
 | 
			
		||||
					next = append(next, f)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sort.Sort(byName(fields))
 | 
			
		||||
 | 
			
		||||
	// Delete all fields that are hidden by the Go rules for embedded fields,
 | 
			
		||||
	// except that fields with TOML tags are promoted.
 | 
			
		||||
 | 
			
		||||
	// The fields are sorted in primary order of name, secondary order
 | 
			
		||||
	// of field index length. Loop over names; for each name, delete
 | 
			
		||||
	// hidden fields by choosing the one dominant field that survives.
 | 
			
		||||
	out := fields[:0]
 | 
			
		||||
	for advance, i := 0, 0; i < len(fields); i += advance {
 | 
			
		||||
		// One iteration per name.
 | 
			
		||||
		// Find the sequence of fields with the name of this first field.
 | 
			
		||||
		fi := fields[i]
 | 
			
		||||
		name := fi.name
 | 
			
		||||
		for advance = 1; i+advance < len(fields); advance++ {
 | 
			
		||||
			fj := fields[i+advance]
 | 
			
		||||
			if fj.name != name {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if advance == 1 { // Only one field with this name
 | 
			
		||||
			out = append(out, fi)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		dominant, ok := dominantField(fields[i : i+advance])
 | 
			
		||||
		if ok {
 | 
			
		||||
			out = append(out, dominant)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fields = out
 | 
			
		||||
	sort.Sort(byIndex(fields))
 | 
			
		||||
 | 
			
		||||
	return fields
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dominantField looks through the fields, all of which are known to
 | 
			
		||||
// have the same name, to find the single field that dominates the
 | 
			
		||||
// others using Go's embedding rules, modified by the presence of
 | 
			
		||||
// TOML tags. If there are multiple top-level fields, the boolean
 | 
			
		||||
// will be false: This condition is an error in Go and we skip all
 | 
			
		||||
// the fields.
 | 
			
		||||
func dominantField(fields []field) (field, bool) {
 | 
			
		||||
	// The fields are sorted in increasing index-length order. The winner
 | 
			
		||||
	// must therefore be one with the shortest index length. Drop all
 | 
			
		||||
	// longer entries, which is easy: just truncate the slice.
 | 
			
		||||
	length := len(fields[0].index)
 | 
			
		||||
	tagged := -1 // Index of first tagged field.
 | 
			
		||||
	for i, f := range fields {
 | 
			
		||||
		if len(f.index) > length {
 | 
			
		||||
			fields = fields[:i]
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if f.tag {
 | 
			
		||||
			if tagged >= 0 {
 | 
			
		||||
				// Multiple tagged fields at the same level: conflict.
 | 
			
		||||
				// Return no field.
 | 
			
		||||
				return field{}, false
 | 
			
		||||
			}
 | 
			
		||||
			tagged = i
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if tagged >= 0 {
 | 
			
		||||
		return fields[tagged], true
 | 
			
		||||
	}
 | 
			
		||||
	// All remaining fields have the same length. If there's more than one,
 | 
			
		||||
	// we have a conflict (two fields named "X" at the same level) and we
 | 
			
		||||
	// return no field.
 | 
			
		||||
	if len(fields) > 1 {
 | 
			
		||||
		return field{}, false
 | 
			
		||||
	}
 | 
			
		||||
	return fields[0], true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fieldCache struct {
 | 
			
		||||
	sync.RWMutex
 | 
			
		||||
	m map[reflect.Type][]field
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cachedTypeFields is like typeFields but uses a cache to avoid repeated work.
 | 
			
		||||
func cachedTypeFields(t reflect.Type) []field {
 | 
			
		||||
	fieldCache.RLock()
 | 
			
		||||
	f := fieldCache.m[t]
 | 
			
		||||
	fieldCache.RUnlock()
 | 
			
		||||
	if f != nil {
 | 
			
		||||
		return f
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Compute fields without lock.
 | 
			
		||||
	// Might duplicate effort but won't hold other computations back.
 | 
			
		||||
	f = typeFields(t)
 | 
			
		||||
	if f == nil {
 | 
			
		||||
		f = []field{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fieldCache.Lock()
 | 
			
		||||
	if fieldCache.m == nil {
 | 
			
		||||
		fieldCache.m = map[reflect.Type][]field{}
 | 
			
		||||
	}
 | 
			
		||||
	fieldCache.m[t] = f
 | 
			
		||||
	fieldCache.Unlock()
 | 
			
		||||
	return f
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/beevik/ntp/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/beevik/ntp/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -2,9 +2,8 @@ language: go
 | 
			
		|||
sudo: false
 | 
			
		||||
 | 
			
		||||
go:
 | 
			
		||||
  - 1.7.x
 | 
			
		||||
  - 1.8.x
 | 
			
		||||
  - 1.9.x
 | 
			
		||||
  - 1.12.x
 | 
			
		||||
  - tip
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								vendor/github.com/beevik/ntp/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/beevik/ntp/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -21,22 +21,23 @@ time, err := ntp.Time("0.beevik-ntp.pool.ntp.org")
 | 
			
		|||
## Querying time metadata
 | 
			
		||||
 | 
			
		||||
To obtain the current time as well as some additional metadata about the time,
 | 
			
		||||
use the `Query` function:
 | 
			
		||||
use the [`Query`](https://godoc.org/github.com/beevik/ntp#Query) function:
 | 
			
		||||
```go
 | 
			
		||||
response, err := ntp.Query("0.beevik-ntp.pool.ntp.org")
 | 
			
		||||
time := time.Now().Add(response.ClockOffset)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Alternatively, use the `QueryWithOptions` function if you want to change the
 | 
			
		||||
default behavior used by the `Query` function:
 | 
			
		||||
Alternatively, use the [`QueryWithOptions`](https://godoc.org/github.com/beevik/ntp#QueryWithOptions)
 | 
			
		||||
function if you want to change the default behavior used by the `Query`
 | 
			
		||||
function:
 | 
			
		||||
```go
 | 
			
		||||
options := ntp.QueryOptions{ Timeout: 30*time.Second, TTL: 5 }
 | 
			
		||||
response, err := ntp.QueryWithOptions("0.beevik-ntp.pool.ntp.org", options)
 | 
			
		||||
time := time.Now().Add(response.ClockOffset)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The `Response` structure returned by `Query` includes the following
 | 
			
		||||
information:
 | 
			
		||||
The [`Response`](https://godoc.org/github.com/beevik/ntp#Response) structure
 | 
			
		||||
returned by `Query` includes the following information:
 | 
			
		||||
* `Time`: The time the server transmitted its response, according to its own clock.
 | 
			
		||||
* `ClockOffset`: The estimated offset of the local system clock relative to the server's clock. For a more accurate time reading, you may add this offset to any subsequent system clock reading.
 | 
			
		||||
* `RTT`: An estimate of the round-trip-time delay between the client and the server.
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +53,9 @@ information:
 | 
			
		|||
* `KissCode`: A 4-character string describing the reason for a "kiss of death" response (stratum=0).
 | 
			
		||||
* `Poll`: The maximum polling interval between successive messages to the server.
 | 
			
		||||
 | 
			
		||||
The `Response` structure's `Validate` method performs additional sanity checks
 | 
			
		||||
to determine whether the response is suitable for time synchronization
 | 
			
		||||
purposes.
 | 
			
		||||
The `Response` structure's [`Validate`](https://godoc.org/github.com/beevik/ntp#Response.Validate)
 | 
			
		||||
method performs additional sanity checks to determine whether the response is
 | 
			
		||||
suitable for time synchronization purposes.
 | 
			
		||||
```go
 | 
			
		||||
err := response.Validate()
 | 
			
		||||
if err == nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								vendor/github.com/beevik/ntp/RELEASE_NOTES.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/beevik/ntp/RELEASE_NOTES.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,13 @@
 | 
			
		|||
Release v0.3.0
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
There have been no breaking changes or further deprecations since the
 | 
			
		||||
previous release.
 | 
			
		||||
 | 
			
		||||
**Changes**
 | 
			
		||||
 | 
			
		||||
* Fixed a bug in the calculation of NTP timestamps.
 | 
			
		||||
 | 
			
		||||
Release v0.2.0
 | 
			
		||||
==============
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								vendor/github.com/beevik/ntp/ntp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/beevik/ntp/ntp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -76,8 +76,12 @@ type ntpTime uint64
 | 
			
		|||
// and returns the corresponding time.Duration value.
 | 
			
		||||
func (t ntpTime) Duration() time.Duration {
 | 
			
		||||
	sec := (t >> 32) * nanoPerSec
 | 
			
		||||
	frac := (t & 0xffffffff) * nanoPerSec >> 32
 | 
			
		||||
	return time.Duration(sec + frac)
 | 
			
		||||
	frac := (t & 0xffffffff) * nanoPerSec
 | 
			
		||||
	nsec := frac >> 32
 | 
			
		||||
	if uint32(frac) >= 0x80000000 {
 | 
			
		||||
		nsec++
 | 
			
		||||
	}
 | 
			
		||||
	return time.Duration(sec + nsec)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Time interprets the fixed-point ntpTime as an absolute time and returns
 | 
			
		||||
| 
						 | 
				
			
			@ -91,10 +95,11 @@ func (t ntpTime) Time() time.Time {
 | 
			
		|||
func toNtpTime(t time.Time) ntpTime {
 | 
			
		||||
	nsec := uint64(t.Sub(ntpEpoch))
 | 
			
		||||
	sec := nsec / nanoPerSec
 | 
			
		||||
	// Round up the fractional component so that repeated conversions
 | 
			
		||||
	// between time.Time and ntpTime do not yield continually decreasing
 | 
			
		||||
	// results.
 | 
			
		||||
	frac := (((nsec - sec*nanoPerSec) << 32) + nanoPerSec - 1) / nanoPerSec
 | 
			
		||||
	nsec = uint64(nsec-sec*nanoPerSec) << 32
 | 
			
		||||
	frac := uint64(nsec / nanoPerSec)
 | 
			
		||||
	if nsec%nanoPerSec >= nanoPerSec/2 {
 | 
			
		||||
		frac++
 | 
			
		||||
	}
 | 
			
		||||
	return ntpTime(sec<<32 | frac)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,10 +110,13 @@ type ntpTimeShort uint32
 | 
			
		|||
// Duration interprets the fixed-point ntpTimeShort as a number of elapsed
 | 
			
		||||
// seconds and returns the corresponding time.Duration value.
 | 
			
		||||
func (t ntpTimeShort) Duration() time.Duration {
 | 
			
		||||
	t64 := uint64(t)
 | 
			
		||||
	sec := (t64 >> 16) * nanoPerSec
 | 
			
		||||
	frac := (t64 & 0xffff) * nanoPerSec >> 16
 | 
			
		||||
	return time.Duration(sec + frac)
 | 
			
		||||
	sec := uint64(t>>16) * nanoPerSec
 | 
			
		||||
	frac := uint64(t&0xffff) * nanoPerSec
 | 
			
		||||
	nsec := frac >> 16
 | 
			
		||||
	if uint16(frac) >= 0x8000 {
 | 
			
		||||
		nsec++
 | 
			
		||||
	}
 | 
			
		||||
	return time.Duration(sec + nsec)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// msg is an internal representation of an NTP packet.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										324
									
								
								vendor/github.com/golang/protobuf/proto/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								vendor/github.com/golang/protobuf/proto/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,324 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
			
		||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	WireVarint     = 0
 | 
			
		||||
	WireFixed32    = 5
 | 
			
		||||
	WireFixed64    = 1
 | 
			
		||||
	WireBytes      = 2
 | 
			
		||||
	WireStartGroup = 3
 | 
			
		||||
	WireEndGroup   = 4
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EncodeVarint returns the varint encoded bytes of v.
 | 
			
		||||
func EncodeVarint(v uint64) []byte {
 | 
			
		||||
	return protowire.AppendVarint(nil, v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SizeVarint returns the length of the varint encoded bytes of v.
 | 
			
		||||
// This is equal to len(EncodeVarint(v)).
 | 
			
		||||
func SizeVarint(v uint64) int {
 | 
			
		||||
	return protowire.SizeVarint(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeVarint parses a varint encoded integer from b,
 | 
			
		||||
// returning the integer value and the length of the varint.
 | 
			
		||||
// It returns (0, 0) if there is a parse error.
 | 
			
		||||
func DecodeVarint(b []byte) (uint64, int) {
 | 
			
		||||
	v, n := protowire.ConsumeVarint(b)
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return 0, 0
 | 
			
		||||
	}
 | 
			
		||||
	return v, n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Buffer is a buffer for encoding and decoding the protobuf wire format.
 | 
			
		||||
// It may be reused between invocations to reduce memory usage.
 | 
			
		||||
type Buffer struct {
 | 
			
		||||
	buf           []byte
 | 
			
		||||
	idx           int
 | 
			
		||||
	deterministic bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewBuffer allocates a new Buffer initialized with buf,
 | 
			
		||||
// where the contents of buf are considered the unread portion of the buffer.
 | 
			
		||||
func NewBuffer(buf []byte) *Buffer {
 | 
			
		||||
	return &Buffer{buf: buf}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetDeterministic specifies whether to use deterministic serialization.
 | 
			
		||||
//
 | 
			
		||||
// Deterministic serialization guarantees that for a given binary, equal
 | 
			
		||||
// messages will always be serialized to the same bytes. This implies:
 | 
			
		||||
//
 | 
			
		||||
//   - Repeated serialization of a message will return the same bytes.
 | 
			
		||||
//   - Different processes of the same binary (which may be executing on
 | 
			
		||||
//     different machines) will serialize equal messages to the same bytes.
 | 
			
		||||
//
 | 
			
		||||
// Note that the deterministic serialization is NOT canonical across
 | 
			
		||||
// languages. It is not guaranteed to remain stable over time. It is unstable
 | 
			
		||||
// across different builds with schema changes due to unknown fields.
 | 
			
		||||
// Users who need canonical serialization (e.g., persistent storage in a
 | 
			
		||||
// canonical form, fingerprinting, etc.) should define their own
 | 
			
		||||
// canonicalization specification and implement their own serializer rather
 | 
			
		||||
// than relying on this API.
 | 
			
		||||
//
 | 
			
		||||
// If deterministic serialization is requested, map entries will be sorted
 | 
			
		||||
// by keys in lexographical order. This is an implementation detail and
 | 
			
		||||
// subject to change.
 | 
			
		||||
func (b *Buffer) SetDeterministic(deterministic bool) {
 | 
			
		||||
	b.deterministic = deterministic
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetBuf sets buf as the internal buffer,
 | 
			
		||||
// where the contents of buf are considered the unread portion of the buffer.
 | 
			
		||||
func (b *Buffer) SetBuf(buf []byte) {
 | 
			
		||||
	b.buf = buf
 | 
			
		||||
	b.idx = 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reset clears the internal buffer of all written and unread data.
 | 
			
		||||
func (b *Buffer) Reset() {
 | 
			
		||||
	b.buf = b.buf[:0]
 | 
			
		||||
	b.idx = 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bytes returns the internal buffer.
 | 
			
		||||
func (b *Buffer) Bytes() []byte {
 | 
			
		||||
	return b.buf
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unread returns the unread portion of the buffer.
 | 
			
		||||
func (b *Buffer) Unread() []byte {
 | 
			
		||||
	return b.buf[b.idx:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshal appends the wire-format encoding of m to the buffer.
 | 
			
		||||
func (b *Buffer) Marshal(m Message) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	b.buf, err = marshalAppend(b.buf, m, b.deterministic)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal parses the wire-format message in the buffer and
 | 
			
		||||
// places the decoded results in m.
 | 
			
		||||
// It does not reset m before unmarshaling.
 | 
			
		||||
func (b *Buffer) Unmarshal(m Message) error {
 | 
			
		||||
	err := UnmarshalMerge(b.Unread(), m)
 | 
			
		||||
	b.idx = len(b.buf)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type unknownFields struct{ XXX_unrecognized protoimpl.UnknownFields }
 | 
			
		||||
 | 
			
		||||
func (m *unknownFields) String() string { panic("not implemented") }
 | 
			
		||||
func (m *unknownFields) Reset()         { panic("not implemented") }
 | 
			
		||||
func (m *unknownFields) ProtoMessage()  { panic("not implemented") }
 | 
			
		||||
 | 
			
		||||
// DebugPrint dumps the encoded bytes of b with a header and footer including s
 | 
			
		||||
// to stdout. This is only intended for debugging.
 | 
			
		||||
func (*Buffer) DebugPrint(s string, b []byte) {
 | 
			
		||||
	m := MessageReflect(new(unknownFields))
 | 
			
		||||
	m.SetUnknown(b)
 | 
			
		||||
	b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface())
 | 
			
		||||
	fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeVarint appends an unsigned varint encoding to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeVarint(v uint64) error {
 | 
			
		||||
	b.buf = protowire.AppendVarint(b.buf, v)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeZigzag32(v uint64) error {
 | 
			
		||||
	return b.EncodeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeZigzag64(v uint64) error {
 | 
			
		||||
	return b.EncodeVarint(uint64((uint64(v) << 1) ^ uint64((int64(v) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeFixed32 appends a 32-bit little-endian integer to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeFixed32(v uint64) error {
 | 
			
		||||
	b.buf = protowire.AppendFixed32(b.buf, uint32(v))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeFixed64 appends a 64-bit little-endian integer to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeFixed64(v uint64) error {
 | 
			
		||||
	b.buf = protowire.AppendFixed64(b.buf, uint64(v))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeRawBytes appends a length-prefixed raw bytes to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeRawBytes(v []byte) error {
 | 
			
		||||
	b.buf = protowire.AppendBytes(b.buf, v)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeStringBytes appends a length-prefixed raw bytes to the buffer.
 | 
			
		||||
// It does not validate whether v contains valid UTF-8.
 | 
			
		||||
func (b *Buffer) EncodeStringBytes(v string) error {
 | 
			
		||||
	b.buf = protowire.AppendString(b.buf, v)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeMessage appends a length-prefixed encoded message to the buffer.
 | 
			
		||||
func (b *Buffer) EncodeMessage(m Message) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	b.buf = protowire.AppendVarint(b.buf, uint64(Size(m)))
 | 
			
		||||
	b.buf, err = marshalAppend(b.buf, m, b.deterministic)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeVarint consumes an encoded unsigned varint from the buffer.
 | 
			
		||||
func (b *Buffer) DecodeVarint() (uint64, error) {
 | 
			
		||||
	v, n := protowire.ConsumeVarint(b.buf[b.idx:])
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return 0, protowire.ParseError(n)
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	return uint64(v), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer.
 | 
			
		||||
func (b *Buffer) DecodeZigzag32() (uint64, error) {
 | 
			
		||||
	v, err := b.DecodeVarint()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return uint64((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer.
 | 
			
		||||
func (b *Buffer) DecodeZigzag64() (uint64, error) {
 | 
			
		||||
	v, err := b.DecodeVarint()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return uint64((uint64(v) >> 1) ^ uint64((int64(v&1)<<63)>>63)), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer.
 | 
			
		||||
func (b *Buffer) DecodeFixed32() (uint64, error) {
 | 
			
		||||
	v, n := protowire.ConsumeFixed32(b.buf[b.idx:])
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return 0, protowire.ParseError(n)
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	return uint64(v), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer.
 | 
			
		||||
func (b *Buffer) DecodeFixed64() (uint64, error) {
 | 
			
		||||
	v, n := protowire.ConsumeFixed64(b.buf[b.idx:])
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return 0, protowire.ParseError(n)
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	return uint64(v), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer.
 | 
			
		||||
// If alloc is specified, it returns a copy the raw bytes
 | 
			
		||||
// rather than a sub-slice of the buffer.
 | 
			
		||||
func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) {
 | 
			
		||||
	v, n := protowire.ConsumeBytes(b.buf[b.idx:])
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return nil, protowire.ParseError(n)
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	if alloc {
 | 
			
		||||
		v = append([]byte(nil), v...)
 | 
			
		||||
	}
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer.
 | 
			
		||||
// It does not validate whether the raw bytes contain valid UTF-8.
 | 
			
		||||
func (b *Buffer) DecodeStringBytes() (string, error) {
 | 
			
		||||
	v, n := protowire.ConsumeString(b.buf[b.idx:])
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		return "", protowire.ParseError(n)
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeMessage consumes a length-prefixed message from the buffer.
 | 
			
		||||
// It does not reset m before unmarshaling.
 | 
			
		||||
func (b *Buffer) DecodeMessage(m Message) error {
 | 
			
		||||
	v, err := b.DecodeRawBytes(false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return UnmarshalMerge(v, m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeGroup consumes a message group from the buffer.
 | 
			
		||||
// It assumes that the start group marker has already been consumed and
 | 
			
		||||
// consumes all bytes until (and including the end group marker).
 | 
			
		||||
// It does not reset m before unmarshaling.
 | 
			
		||||
func (b *Buffer) DecodeGroup(m Message) error {
 | 
			
		||||
	v, n, err := consumeGroup(b.buf[b.idx:])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	b.idx += n
 | 
			
		||||
	return UnmarshalMerge(v, m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeGroup parses b until it finds an end group marker, returning
 | 
			
		||||
// the raw bytes of the message (excluding the end group marker) and the
 | 
			
		||||
// the total length of the message (including the end group marker).
 | 
			
		||||
func consumeGroup(b []byte) ([]byte, int, error) {
 | 
			
		||||
	b0 := b
 | 
			
		||||
	depth := 1 // assume this follows a start group marker
 | 
			
		||||
	for {
 | 
			
		||||
		_, wtyp, tagLen := protowire.ConsumeTag(b)
 | 
			
		||||
		if tagLen < 0 {
 | 
			
		||||
			return nil, 0, protowire.ParseError(tagLen)
 | 
			
		||||
		}
 | 
			
		||||
		b = b[tagLen:]
 | 
			
		||||
 | 
			
		||||
		var valLen int
 | 
			
		||||
		switch wtyp {
 | 
			
		||||
		case protowire.VarintType:
 | 
			
		||||
			_, valLen = protowire.ConsumeVarint(b)
 | 
			
		||||
		case protowire.Fixed32Type:
 | 
			
		||||
			_, valLen = protowire.ConsumeFixed32(b)
 | 
			
		||||
		case protowire.Fixed64Type:
 | 
			
		||||
			_, valLen = protowire.ConsumeFixed64(b)
 | 
			
		||||
		case protowire.BytesType:
 | 
			
		||||
			_, valLen = protowire.ConsumeBytes(b)
 | 
			
		||||
		case protowire.StartGroupType:
 | 
			
		||||
			depth++
 | 
			
		||||
		case protowire.EndGroupType:
 | 
			
		||||
			depth--
 | 
			
		||||
		default:
 | 
			
		||||
			return nil, 0, errors.New("proto: cannot parse reserved wire type")
 | 
			
		||||
		}
 | 
			
		||||
		if valLen < 0 {
 | 
			
		||||
			return nil, 0, protowire.ParseError(valLen)
 | 
			
		||||
		}
 | 
			
		||||
		b = b[valLen:]
 | 
			
		||||
 | 
			
		||||
		if depth == 0 {
 | 
			
		||||
			return b0[:len(b0)-len(b)-tagLen], len(b0) - len(b), nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										253
									
								
								vendor/github.com/golang/protobuf/proto/clone.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										253
									
								
								vendor/github.com/golang/protobuf/proto/clone.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,253 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2011 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// Protocol buffer deep copy and merge.
 | 
			
		||||
// TODO: RawMessage.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Clone returns a deep copy of a protocol buffer.
 | 
			
		||||
func Clone(src Message) Message {
 | 
			
		||||
	in := reflect.ValueOf(src)
 | 
			
		||||
	if in.IsNil() {
 | 
			
		||||
		return src
 | 
			
		||||
	}
 | 
			
		||||
	out := reflect.New(in.Type().Elem())
 | 
			
		||||
	dst := out.Interface().(Message)
 | 
			
		||||
	Merge(dst, src)
 | 
			
		||||
	return dst
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merger is the interface representing objects that can merge messages of the same type.
 | 
			
		||||
type Merger interface {
 | 
			
		||||
	// Merge merges src into this message.
 | 
			
		||||
	// Required and optional fields that are set in src will be set to that value in dst.
 | 
			
		||||
	// Elements of repeated fields will be appended.
 | 
			
		||||
	//
 | 
			
		||||
	// Merge may panic if called with a different argument type than the receiver.
 | 
			
		||||
	Merge(src Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// generatedMerger is the custom merge method that generated protos will have.
 | 
			
		||||
// We must add this method since a generate Merge method will conflict with
 | 
			
		||||
// many existing protos that have a Merge data field already defined.
 | 
			
		||||
type generatedMerger interface {
 | 
			
		||||
	XXX_Merge(src Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merge merges src into dst.
 | 
			
		||||
// Required and optional fields that are set in src will be set to that value in dst.
 | 
			
		||||
// Elements of repeated fields will be appended.
 | 
			
		||||
// Merge panics if src and dst are not the same type, or if dst is nil.
 | 
			
		||||
func Merge(dst, src Message) {
 | 
			
		||||
	if m, ok := dst.(Merger); ok {
 | 
			
		||||
		m.Merge(src)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	in := reflect.ValueOf(src)
 | 
			
		||||
	out := reflect.ValueOf(dst)
 | 
			
		||||
	if out.IsNil() {
 | 
			
		||||
		panic("proto: nil destination")
 | 
			
		||||
	}
 | 
			
		||||
	if in.Type() != out.Type() {
 | 
			
		||||
		panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src))
 | 
			
		||||
	}
 | 
			
		||||
	if in.IsNil() {
 | 
			
		||||
		return // Merge from nil src is a noop
 | 
			
		||||
	}
 | 
			
		||||
	if m, ok := dst.(generatedMerger); ok {
 | 
			
		||||
		m.XXX_Merge(src)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	mergeStruct(out.Elem(), in.Elem())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mergeStruct(out, in reflect.Value) {
 | 
			
		||||
	sprop := GetProperties(in.Type())
 | 
			
		||||
	for i := 0; i < in.NumField(); i++ {
 | 
			
		||||
		f := in.Type().Field(i)
 | 
			
		||||
		if strings.HasPrefix(f.Name, "XXX_") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if emIn, err := extendable(in.Addr().Interface()); err == nil {
 | 
			
		||||
		emOut, _ := extendable(out.Addr().Interface())
 | 
			
		||||
		mIn, muIn := emIn.extensionsRead()
 | 
			
		||||
		if mIn != nil {
 | 
			
		||||
			mOut := emOut.extensionsWrite()
 | 
			
		||||
			muIn.Lock()
 | 
			
		||||
			mergeExtension(mOut, mIn)
 | 
			
		||||
			muIn.Unlock()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uf := in.FieldByName("XXX_unrecognized")
 | 
			
		||||
	if !uf.IsValid() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	uin := uf.Bytes()
 | 
			
		||||
	if len(uin) > 0 {
 | 
			
		||||
		out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mergeAny performs a merge between two values of the same type.
 | 
			
		||||
// viaPtr indicates whether the values were indirected through a pointer (implying proto2).
 | 
			
		||||
// prop is set if this is a struct field (it may be nil).
 | 
			
		||||
func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) {
 | 
			
		||||
	if in.Type() == protoMessageType {
 | 
			
		||||
		if !in.IsNil() {
 | 
			
		||||
			if out.IsNil() {
 | 
			
		||||
				out.Set(reflect.ValueOf(Clone(in.Interface().(Message))))
 | 
			
		||||
			} else {
 | 
			
		||||
				Merge(out.Interface().(Message), in.Interface().(Message))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	switch in.Kind() {
 | 
			
		||||
	case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64,
 | 
			
		||||
		reflect.String, reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		if !viaPtr && isProto3Zero(in) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		out.Set(in)
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		// Probably a oneof field; copy non-nil values.
 | 
			
		||||
		if in.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// Allocate destination if it is not set, or set to a different type.
 | 
			
		||||
		// Otherwise we will merge as normal.
 | 
			
		||||
		if out.IsNil() || out.Elem().Type() != in.Elem().Type() {
 | 
			
		||||
			out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T)
 | 
			
		||||
		}
 | 
			
		||||
		mergeAny(out.Elem(), in.Elem(), false, nil)
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		if in.Len() == 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if out.IsNil() {
 | 
			
		||||
			out.Set(reflect.MakeMap(in.Type()))
 | 
			
		||||
		}
 | 
			
		||||
		// For maps with value types of *T or []byte we need to deep copy each value.
 | 
			
		||||
		elemKind := in.Type().Elem().Kind()
 | 
			
		||||
		for _, key := range in.MapKeys() {
 | 
			
		||||
			var val reflect.Value
 | 
			
		||||
			switch elemKind {
 | 
			
		||||
			case reflect.Ptr:
 | 
			
		||||
				val = reflect.New(in.Type().Elem().Elem())
 | 
			
		||||
				mergeAny(val, in.MapIndex(key), false, nil)
 | 
			
		||||
			case reflect.Slice:
 | 
			
		||||
				val = in.MapIndex(key)
 | 
			
		||||
				val = reflect.ValueOf(append([]byte{}, val.Bytes()...))
 | 
			
		||||
			default:
 | 
			
		||||
				val = in.MapIndex(key)
 | 
			
		||||
			}
 | 
			
		||||
			out.SetMapIndex(key, val)
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		if in.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if out.IsNil() {
 | 
			
		||||
			out.Set(reflect.New(in.Elem().Type()))
 | 
			
		||||
		}
 | 
			
		||||
		mergeAny(out.Elem(), in.Elem(), true, nil)
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		if in.IsNil() {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if in.Type().Elem().Kind() == reflect.Uint8 {
 | 
			
		||||
			// []byte is a scalar bytes field, not a repeated field.
 | 
			
		||||
 | 
			
		||||
			// Edge case: if this is in a proto3 message, a zero length
 | 
			
		||||
			// bytes field is considered the zero value, and should not
 | 
			
		||||
			// be merged.
 | 
			
		||||
			if prop != nil && prop.proto3 && in.Len() == 0 {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Make a deep copy.
 | 
			
		||||
			// Append to []byte{} instead of []byte(nil) so that we never end up
 | 
			
		||||
			// with a nil result.
 | 
			
		||||
			out.SetBytes(append([]byte{}, in.Bytes()...))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		n := in.Len()
 | 
			
		||||
		if out.IsNil() {
 | 
			
		||||
			out.Set(reflect.MakeSlice(in.Type(), 0, n))
 | 
			
		||||
		}
 | 
			
		||||
		switch in.Type().Elem().Kind() {
 | 
			
		||||
		case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64,
 | 
			
		||||
			reflect.String, reflect.Uint32, reflect.Uint64:
 | 
			
		||||
			out.Set(reflect.AppendSlice(out, in))
 | 
			
		||||
		default:
 | 
			
		||||
			for i := 0; i < n; i++ {
 | 
			
		||||
				x := reflect.Indirect(reflect.New(in.Type().Elem()))
 | 
			
		||||
				mergeAny(x, in.Index(i), false, nil)
 | 
			
		||||
				out.Set(reflect.Append(out, x))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		mergeStruct(out, in)
 | 
			
		||||
	default:
 | 
			
		||||
		// unknown type, so not a protocol buffer
 | 
			
		||||
		log.Printf("proto: don't know how to copy %v", in)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func mergeExtension(out, in map[int32]Extension) {
 | 
			
		||||
	for extNum, eIn := range in {
 | 
			
		||||
		eOut := Extension{desc: eIn.desc}
 | 
			
		||||
		if eIn.value != nil {
 | 
			
		||||
			v := reflect.New(reflect.TypeOf(eIn.value)).Elem()
 | 
			
		||||
			mergeAny(v, reflect.ValueOf(eIn.value), false, nil)
 | 
			
		||||
			eOut.value = v.Interface()
 | 
			
		||||
		}
 | 
			
		||||
		if eIn.enc != nil {
 | 
			
		||||
			eOut.enc = make([]byte, len(eIn.enc))
 | 
			
		||||
			copy(eOut.enc, eIn.enc)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		out[extNum] = eOut
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										427
									
								
								vendor/github.com/golang/protobuf/proto/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										427
									
								
								vendor/github.com/golang/protobuf/proto/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,427 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Routines for decoding protocol buffer data to construct in-memory representations.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// errOverflow is returned when an integer is too large to be represented.
 | 
			
		||||
var errOverflow = errors.New("proto: integer overflow")
 | 
			
		||||
 | 
			
		||||
// ErrInternalBadWireType is returned by generated code when an incorrect
 | 
			
		||||
// wire type is encountered. It does not get returned to user code.
 | 
			
		||||
var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof")
 | 
			
		||||
 | 
			
		||||
// DecodeVarint reads a varint-encoded integer from the slice.
 | 
			
		||||
// It returns the integer and the number of bytes consumed, or
 | 
			
		||||
// zero if there is not enough.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// int32, int64, uint32, uint64, bool, and enum
 | 
			
		||||
// protocol buffer types.
 | 
			
		||||
func DecodeVarint(buf []byte) (x uint64, n int) {
 | 
			
		||||
	for shift := uint(0); shift < 64; shift += 7 {
 | 
			
		||||
		if n >= len(buf) {
 | 
			
		||||
			return 0, 0
 | 
			
		||||
		}
 | 
			
		||||
		b := uint64(buf[n])
 | 
			
		||||
		n++
 | 
			
		||||
		x |= (b & 0x7F) << shift
 | 
			
		||||
		if (b & 0x80) == 0 {
 | 
			
		||||
			return x, n
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The number is too large to represent in a 64-bit value.
 | 
			
		||||
	return 0, 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Buffer) decodeVarintSlow() (x uint64, err error) {
 | 
			
		||||
	i := p.index
 | 
			
		||||
	l := len(p.buf)
 | 
			
		||||
 | 
			
		||||
	for shift := uint(0); shift < 64; shift += 7 {
 | 
			
		||||
		if i >= l {
 | 
			
		||||
			err = io.ErrUnexpectedEOF
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		b := p.buf[i]
 | 
			
		||||
		i++
 | 
			
		||||
		x |= (uint64(b) & 0x7F) << shift
 | 
			
		||||
		if b < 0x80 {
 | 
			
		||||
			p.index = i
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The number is too large to represent in a 64-bit value.
 | 
			
		||||
	err = errOverflow
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeVarint reads a varint-encoded integer from the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// int32, int64, uint32, uint64, bool, and enum
 | 
			
		||||
// protocol buffer types.
 | 
			
		||||
func (p *Buffer) DecodeVarint() (x uint64, err error) {
 | 
			
		||||
	i := p.index
 | 
			
		||||
	buf := p.buf
 | 
			
		||||
 | 
			
		||||
	if i >= len(buf) {
 | 
			
		||||
		return 0, io.ErrUnexpectedEOF
 | 
			
		||||
	} else if buf[i] < 0x80 {
 | 
			
		||||
		p.index++
 | 
			
		||||
		return uint64(buf[i]), nil
 | 
			
		||||
	} else if len(buf)-i < 10 {
 | 
			
		||||
		return p.decodeVarintSlow()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var b uint64
 | 
			
		||||
	// we already checked the first byte
 | 
			
		||||
	x = uint64(buf[i]) - 0x80
 | 
			
		||||
	i++
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 7
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 7
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 14
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 14
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 21
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 21
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 28
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 28
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 35
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 35
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 42
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 42
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 49
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 49
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 56
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
	x -= 0x80 << 56
 | 
			
		||||
 | 
			
		||||
	b = uint64(buf[i])
 | 
			
		||||
	i++
 | 
			
		||||
	x += b << 63
 | 
			
		||||
	if b&0x80 == 0 {
 | 
			
		||||
		goto done
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0, errOverflow
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	p.index = i
 | 
			
		||||
	return x, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeFixed64 reads a 64-bit integer from the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// fixed64, sfixed64, and double protocol buffer types.
 | 
			
		||||
func (p *Buffer) DecodeFixed64() (x uint64, err error) {
 | 
			
		||||
	// x, err already 0
 | 
			
		||||
	i := p.index + 8
 | 
			
		||||
	if i < 0 || i > len(p.buf) {
 | 
			
		||||
		err = io.ErrUnexpectedEOF
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.index = i
 | 
			
		||||
 | 
			
		||||
	x = uint64(p.buf[i-8])
 | 
			
		||||
	x |= uint64(p.buf[i-7]) << 8
 | 
			
		||||
	x |= uint64(p.buf[i-6]) << 16
 | 
			
		||||
	x |= uint64(p.buf[i-5]) << 24
 | 
			
		||||
	x |= uint64(p.buf[i-4]) << 32
 | 
			
		||||
	x |= uint64(p.buf[i-3]) << 40
 | 
			
		||||
	x |= uint64(p.buf[i-2]) << 48
 | 
			
		||||
	x |= uint64(p.buf[i-1]) << 56
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeFixed32 reads a 32-bit integer from the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// fixed32, sfixed32, and float protocol buffer types.
 | 
			
		||||
func (p *Buffer) DecodeFixed32() (x uint64, err error) {
 | 
			
		||||
	// x, err already 0
 | 
			
		||||
	i := p.index + 4
 | 
			
		||||
	if i < 0 || i > len(p.buf) {
 | 
			
		||||
		err = io.ErrUnexpectedEOF
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.index = i
 | 
			
		||||
 | 
			
		||||
	x = uint64(p.buf[i-4])
 | 
			
		||||
	x |= uint64(p.buf[i-3]) << 8
 | 
			
		||||
	x |= uint64(p.buf[i-2]) << 16
 | 
			
		||||
	x |= uint64(p.buf[i-1]) << 24
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeZigzag64 reads a zigzag-encoded 64-bit integer
 | 
			
		||||
// from the Buffer.
 | 
			
		||||
// This is the format used for the sint64 protocol buffer type.
 | 
			
		||||
func (p *Buffer) DecodeZigzag64() (x uint64, err error) {
 | 
			
		||||
	x, err = p.DecodeVarint()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeZigzag32 reads a zigzag-encoded 32-bit integer
 | 
			
		||||
// from  the Buffer.
 | 
			
		||||
// This is the format used for the sint32 protocol buffer type.
 | 
			
		||||
func (p *Buffer) DecodeZigzag32() (x uint64, err error) {
 | 
			
		||||
	x, err = p.DecodeVarint()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31))
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeRawBytes reads a count-delimited byte buffer from the Buffer.
 | 
			
		||||
// This is the format used for the bytes protocol buffer
 | 
			
		||||
// type and for embedded messages.
 | 
			
		||||
func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) {
 | 
			
		||||
	n, err := p.DecodeVarint()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nb := int(n)
 | 
			
		||||
	if nb < 0 {
 | 
			
		||||
		return nil, fmt.Errorf("proto: bad byte length %d", nb)
 | 
			
		||||
	}
 | 
			
		||||
	end := p.index + nb
 | 
			
		||||
	if end < p.index || end > len(p.buf) {
 | 
			
		||||
		return nil, io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !alloc {
 | 
			
		||||
		// todo: check if can get more uses of alloc=false
 | 
			
		||||
		buf = p.buf[p.index:end]
 | 
			
		||||
		p.index += nb
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	buf = make([]byte, nb)
 | 
			
		||||
	copy(buf, p.buf[p.index:])
 | 
			
		||||
	p.index += nb
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeStringBytes reads an encoded string from the Buffer.
 | 
			
		||||
// This is the format used for the proto2 string type.
 | 
			
		||||
func (p *Buffer) DecodeStringBytes() (s string, err error) {
 | 
			
		||||
	buf, err := p.DecodeRawBytes(false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return string(buf), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshaler is the interface representing objects that can
 | 
			
		||||
// unmarshal themselves.  The argument points to data that may be
 | 
			
		||||
// overwritten, so implementations should not keep references to the
 | 
			
		||||
// buffer.
 | 
			
		||||
// Unmarshal implementations should not clear the receiver.
 | 
			
		||||
// Any unmarshaled data should be merged into the receiver.
 | 
			
		||||
// Callers of Unmarshal that do not want to retain existing data
 | 
			
		||||
// should Reset the receiver before calling Unmarshal.
 | 
			
		||||
type Unmarshaler interface {
 | 
			
		||||
	Unmarshal([]byte) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// newUnmarshaler is the interface representing objects that can
 | 
			
		||||
// unmarshal themselves. The semantics are identical to Unmarshaler.
 | 
			
		||||
//
 | 
			
		||||
// This exists to support protoc-gen-go generated messages.
 | 
			
		||||
// The proto package will stop type-asserting to this interface in the future.
 | 
			
		||||
//
 | 
			
		||||
// DO NOT DEPEND ON THIS.
 | 
			
		||||
type newUnmarshaler interface {
 | 
			
		||||
	XXX_Unmarshal([]byte) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal parses the protocol buffer representation in buf and places the
 | 
			
		||||
// decoded result in pb.  If the struct underlying pb does not match
 | 
			
		||||
// the data in buf, the results can be unpredictable.
 | 
			
		||||
//
 | 
			
		||||
// Unmarshal resets pb before starting to unmarshal, so any
 | 
			
		||||
// existing data in pb is always removed. Use UnmarshalMerge
 | 
			
		||||
// to preserve and append to existing data.
 | 
			
		||||
func Unmarshal(buf []byte, pb Message) error {
 | 
			
		||||
	pb.Reset()
 | 
			
		||||
	if u, ok := pb.(newUnmarshaler); ok {
 | 
			
		||||
		return u.XXX_Unmarshal(buf)
 | 
			
		||||
	}
 | 
			
		||||
	if u, ok := pb.(Unmarshaler); ok {
 | 
			
		||||
		return u.Unmarshal(buf)
 | 
			
		||||
	}
 | 
			
		||||
	return NewBuffer(buf).Unmarshal(pb)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalMerge parses the protocol buffer representation in buf and
 | 
			
		||||
// writes the decoded result to pb.  If the struct underlying pb does not match
 | 
			
		||||
// the data in buf, the results can be unpredictable.
 | 
			
		||||
//
 | 
			
		||||
// UnmarshalMerge merges into existing data in pb.
 | 
			
		||||
// Most code should use Unmarshal instead.
 | 
			
		||||
func UnmarshalMerge(buf []byte, pb Message) error {
 | 
			
		||||
	if u, ok := pb.(newUnmarshaler); ok {
 | 
			
		||||
		return u.XXX_Unmarshal(buf)
 | 
			
		||||
	}
 | 
			
		||||
	if u, ok := pb.(Unmarshaler); ok {
 | 
			
		||||
		// NOTE: The history of proto have unfortunately been inconsistent
 | 
			
		||||
		// whether Unmarshaler should or should not implicitly clear itself.
 | 
			
		||||
		// Some implementations do, most do not.
 | 
			
		||||
		// Thus, calling this here may or may not do what people want.
 | 
			
		||||
		//
 | 
			
		||||
		// See https://github.com/golang/protobuf/issues/424
 | 
			
		||||
		return u.Unmarshal(buf)
 | 
			
		||||
	}
 | 
			
		||||
	return NewBuffer(buf).Unmarshal(pb)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeMessage reads a count-delimited message from the Buffer.
 | 
			
		||||
func (p *Buffer) DecodeMessage(pb Message) error {
 | 
			
		||||
	enc, err := p.DecodeRawBytes(false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return NewBuffer(enc).Unmarshal(pb)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DecodeGroup reads a tag-delimited group from the Buffer.
 | 
			
		||||
// StartGroup tag is already consumed. This function consumes
 | 
			
		||||
// EndGroup tag.
 | 
			
		||||
func (p *Buffer) DecodeGroup(pb Message) error {
 | 
			
		||||
	b := p.buf[p.index:]
 | 
			
		||||
	x, y := findEndGroup(b)
 | 
			
		||||
	if x < 0 {
 | 
			
		||||
		return io.ErrUnexpectedEOF
 | 
			
		||||
	}
 | 
			
		||||
	err := Unmarshal(b[:x], pb)
 | 
			
		||||
	p.index += y
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal parses the protocol buffer representation in the
 | 
			
		||||
// Buffer and places the decoded result in pb.  If the struct
 | 
			
		||||
// underlying pb does not match the data in the buffer, the results can be
 | 
			
		||||
// unpredictable.
 | 
			
		||||
//
 | 
			
		||||
// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal.
 | 
			
		||||
func (p *Buffer) Unmarshal(pb Message) error {
 | 
			
		||||
	// If the object can unmarshal itself, let it.
 | 
			
		||||
	if u, ok := pb.(newUnmarshaler); ok {
 | 
			
		||||
		err := u.XXX_Unmarshal(p.buf[p.index:])
 | 
			
		||||
		p.index = len(p.buf)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if u, ok := pb.(Unmarshaler); ok {
 | 
			
		||||
		// NOTE: The history of proto have unfortunately been inconsistent
 | 
			
		||||
		// whether Unmarshaler should or should not implicitly clear itself.
 | 
			
		||||
		// Some implementations do, most do not.
 | 
			
		||||
		// Thus, calling this here may or may not do what people want.
 | 
			
		||||
		//
 | 
			
		||||
		// See https://github.com/golang/protobuf/issues/424
 | 
			
		||||
		err := u.Unmarshal(p.buf[p.index:])
 | 
			
		||||
		p.index = len(p.buf)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Slow workaround for messages that aren't Unmarshalers.
 | 
			
		||||
	// This includes some hand-coded .pb.go files and
 | 
			
		||||
	// bootstrap protos.
 | 
			
		||||
	// TODO: fix all of those and then add Unmarshal to
 | 
			
		||||
	// the Message interface. Then:
 | 
			
		||||
	// The cast above and code below can be deleted.
 | 
			
		||||
	// The old unmarshaler can be deleted.
 | 
			
		||||
	// Clients can call Unmarshal directly (can already do that, actually).
 | 
			
		||||
	var info InternalMessageInfo
 | 
			
		||||
	err := info.Unmarshal(pb, p.buf[p.index:])
 | 
			
		||||
	p.index = len(p.buf)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/defaults.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/defaults.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SetDefaults sets unpopulated scalar fields to their default values.
 | 
			
		||||
// Fields within a oneof are not set even if they have a default value.
 | 
			
		||||
// SetDefaults is recursively called upon any populated message fields.
 | 
			
		||||
func SetDefaults(m Message) {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		setDefaults(MessageReflect(m))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setDefaults(m protoreflect.Message) {
 | 
			
		||||
	fds := m.Descriptor().Fields()
 | 
			
		||||
	for i := 0; i < fds.Len(); i++ {
 | 
			
		||||
		fd := fds.Get(i)
 | 
			
		||||
		if !m.Has(fd) {
 | 
			
		||||
			if fd.HasDefault() && fd.ContainingOneof() == nil {
 | 
			
		||||
				v := fd.Default()
 | 
			
		||||
				if fd.Kind() == protoreflect.BytesKind {
 | 
			
		||||
					v = protoreflect.ValueOf(append([]byte(nil), v.Bytes()...)) // copy the default bytes
 | 
			
		||||
				}
 | 
			
		||||
				m.Set(fd, v)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
			
		||||
		switch {
 | 
			
		||||
		// Handle singular message.
 | 
			
		||||
		case fd.Cardinality() != protoreflect.Repeated:
 | 
			
		||||
			if fd.Message() != nil {
 | 
			
		||||
				setDefaults(m.Get(fd).Message())
 | 
			
		||||
			}
 | 
			
		||||
		// Handle list of messages.
 | 
			
		||||
		case fd.IsList():
 | 
			
		||||
			if fd.Message() != nil {
 | 
			
		||||
				ls := m.Get(fd).List()
 | 
			
		||||
				for i := 0; i < ls.Len(); i++ {
 | 
			
		||||
					setDefaults(ls.Get(i).Message())
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		// Handle map of messages.
 | 
			
		||||
		case fd.IsMap():
 | 
			
		||||
			if fd.MapValue().Message() != nil {
 | 
			
		||||
				ms := m.Get(fd).Map()
 | 
			
		||||
				ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool {
 | 
			
		||||
					setDefaults(v.Message())
 | 
			
		||||
					return true
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										105
									
								
								vendor/github.com/golang/protobuf/proto/deprecated.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										105
									
								
								vendor/github.com/golang/protobuf/proto/deprecated.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,63 +1,92 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2018 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import "errors"
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
var (
 | 
			
		||||
	// Deprecated: No longer returned.
 | 
			
		||||
	ErrNil = errors.New("proto: Marshal called with nil")
 | 
			
		||||
 | 
			
		||||
	// Deprecated: No longer returned.
 | 
			
		||||
	ErrTooLarge = errors.New("proto: message encodes to over 2 GB")
 | 
			
		||||
 | 
			
		||||
	// Deprecated: No longer returned.
 | 
			
		||||
	ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 }
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func GetStats() Stats { return Stats{} }
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func MarshalMessageSet(interface{}) ([]byte, error) {
 | 
			
		||||
	return nil, errors.New("proto: not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func UnmarshalMessageSet([]byte, interface{}) error {
 | 
			
		||||
	return errors.New("proto: not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func MarshalMessageSetJSON(interface{}) ([]byte, error) {
 | 
			
		||||
	return nil, errors.New("proto: not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func UnmarshalMessageSetJSON([]byte, interface{}) error {
 | 
			
		||||
	return errors.New("proto: not implemented")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: do not use.
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func RegisterMessageSetType(Message, int32, string) {}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func EnumName(m map[int32]string, v int32) string {
 | 
			
		||||
	s, ok := m[v]
 | 
			
		||||
	if ok {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
	return strconv.Itoa(int(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) {
 | 
			
		||||
	if data[0] == '"' {
 | 
			
		||||
		// New style: enums are strings.
 | 
			
		||||
		var repr string
 | 
			
		||||
		if err := json.Unmarshal(data, &repr); err != nil {
 | 
			
		||||
			return -1, err
 | 
			
		||||
		}
 | 
			
		||||
		val, ok := m[repr]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr)
 | 
			
		||||
		}
 | 
			
		||||
		return val, nil
 | 
			
		||||
	}
 | 
			
		||||
	// Old style: enums are ints.
 | 
			
		||||
	var val int32
 | 
			
		||||
	if err := json.Unmarshal(data, &val); err != nil {
 | 
			
		||||
		return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName)
 | 
			
		||||
	}
 | 
			
		||||
	return val, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
type InternalMessageInfo struct{}
 | 
			
		||||
 | 
			
		||||
func (*InternalMessageInfo) DiscardUnknown(Message)                        { panic("not implemented") }
 | 
			
		||||
func (*InternalMessageInfo) Marshal([]byte, Message, bool) ([]byte, error) { panic("not implemented") }
 | 
			
		||||
func (*InternalMessageInfo) Merge(Message, Message)                        { panic("not implemented") }
 | 
			
		||||
func (*InternalMessageInfo) Size(Message) int                              { panic("not implemented") }
 | 
			
		||||
func (*InternalMessageInfo) Unmarshal(Message, []byte) error               { panic("not implemented") }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										356
									
								
								vendor/github.com/golang/protobuf/proto/discard.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										356
									
								
								vendor/github.com/golang/protobuf/proto/discard.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,48 +1,13 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2017 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type generatedDiscarder interface {
 | 
			
		||||
	XXX_DiscardUnknown()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DiscardUnknown recursively discards all unknown fields from this message
 | 
			
		||||
// and all embedded messages.
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -51,300 +16,43 @@ type generatedDiscarder interface {
 | 
			
		|||
// marshal to be able to produce a message that continues to have those
 | 
			
		||||
// unrecognized fields. To avoid this, DiscardUnknown is used to
 | 
			
		||||
// explicitly clear the unknown fields after unmarshaling.
 | 
			
		||||
//
 | 
			
		||||
// For proto2 messages, the unknown fields of message extensions are only
 | 
			
		||||
// discarded from messages that have been accessed via GetExtension.
 | 
			
		||||
func DiscardUnknown(m Message) {
 | 
			
		||||
	if m, ok := m.(generatedDiscarder); ok {
 | 
			
		||||
		m.XXX_DiscardUnknown()
 | 
			
		||||
		return
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		discardUnknown(MessageReflect(m))
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: Dynamically populate a InternalMessageInfo for legacy messages,
 | 
			
		||||
	// but the master branch has no implementation for InternalMessageInfo,
 | 
			
		||||
	// so it would be more work to replicate that approach.
 | 
			
		||||
	discardLegacy(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DiscardUnknown recursively discards all unknown fields.
 | 
			
		||||
func (a *InternalMessageInfo) DiscardUnknown(m Message) {
 | 
			
		||||
	di := atomicLoadDiscardInfo(&a.discard)
 | 
			
		||||
	if di == nil {
 | 
			
		||||
		di = getDiscardInfo(reflect.TypeOf(m).Elem())
 | 
			
		||||
		atomicStoreDiscardInfo(&a.discard, di)
 | 
			
		||||
	}
 | 
			
		||||
	di.discard(toPointer(&m))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type discardInfo struct {
 | 
			
		||||
	typ reflect.Type
 | 
			
		||||
 | 
			
		||||
	initialized int32 // 0: only typ is valid, 1: everything is valid
 | 
			
		||||
	lock        sync.Mutex
 | 
			
		||||
 | 
			
		||||
	fields       []discardFieldInfo
 | 
			
		||||
	unrecognized field
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type discardFieldInfo struct {
 | 
			
		||||
	field   field // Offset of field, guaranteed to be valid
 | 
			
		||||
	discard func(src pointer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	discardInfoMap  = map[reflect.Type]*discardInfo{}
 | 
			
		||||
	discardInfoLock sync.Mutex
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func getDiscardInfo(t reflect.Type) *discardInfo {
 | 
			
		||||
	discardInfoLock.Lock()
 | 
			
		||||
	defer discardInfoLock.Unlock()
 | 
			
		||||
	di := discardInfoMap[t]
 | 
			
		||||
	if di == nil {
 | 
			
		||||
		di = &discardInfo{typ: t}
 | 
			
		||||
		discardInfoMap[t] = di
 | 
			
		||||
	}
 | 
			
		||||
	return di
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (di *discardInfo) discard(src pointer) {
 | 
			
		||||
	if src.isNil() {
 | 
			
		||||
		return // Nothing to do.
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if atomic.LoadInt32(&di.initialized) == 0 {
 | 
			
		||||
		di.computeDiscardInfo()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, fi := range di.fields {
 | 
			
		||||
		sfp := src.offset(fi.field)
 | 
			
		||||
		fi.discard(sfp)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For proto2 messages, only discard unknown fields in message extensions
 | 
			
		||||
	// that have been accessed via GetExtension.
 | 
			
		||||
	if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil {
 | 
			
		||||
		// Ignore lock since DiscardUnknown is not concurrency safe.
 | 
			
		||||
		emm, _ := em.extensionsRead()
 | 
			
		||||
		for _, mx := range emm {
 | 
			
		||||
			if m, ok := mx.value.(Message); ok {
 | 
			
		||||
				DiscardUnknown(m)
 | 
			
		||||
func discardUnknown(m protoreflect.Message) {
 | 
			
		||||
	m.Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool {
 | 
			
		||||
		switch {
 | 
			
		||||
		// Handle singular message.
 | 
			
		||||
		case fd.Cardinality() != protoreflect.Repeated:
 | 
			
		||||
			if fd.Message() != nil {
 | 
			
		||||
				discardUnknown(m.Get(fd).Message())
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if di.unrecognized.IsValid() {
 | 
			
		||||
		*src.offset(di.unrecognized).toBytes() = nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (di *discardInfo) computeDiscardInfo() {
 | 
			
		||||
	di.lock.Lock()
 | 
			
		||||
	defer di.lock.Unlock()
 | 
			
		||||
	if di.initialized != 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t := di.typ
 | 
			
		||||
	n := t.NumField()
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < n; i++ {
 | 
			
		||||
		f := t.Field(i)
 | 
			
		||||
		if strings.HasPrefix(f.Name, "XXX_") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dfi := discardFieldInfo{field: toField(&f)}
 | 
			
		||||
		tf := f.Type
 | 
			
		||||
 | 
			
		||||
		// Unwrap tf to get its most basic type.
 | 
			
		||||
		var isPointer, isSlice bool
 | 
			
		||||
		if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 {
 | 
			
		||||
			isSlice = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if tf.Kind() == reflect.Ptr {
 | 
			
		||||
			isPointer = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if isPointer && isSlice && tf.Kind() != reflect.Struct {
 | 
			
		||||
			panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch tf.Kind() {
 | 
			
		||||
		case reflect.Struct:
 | 
			
		||||
			switch {
 | 
			
		||||
			case !isPointer:
 | 
			
		||||
				panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name))
 | 
			
		||||
			case isSlice: // E.g., []*pb.T
 | 
			
		||||
				di := getDiscardInfo(tf)
 | 
			
		||||
				dfi.discard = func(src pointer) {
 | 
			
		||||
					sps := src.getPointerSlice()
 | 
			
		||||
					for _, sp := range sps {
 | 
			
		||||
						if !sp.isNil() {
 | 
			
		||||
							di.discard(sp)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., *pb.T
 | 
			
		||||
				di := getDiscardInfo(tf)
 | 
			
		||||
				dfi.discard = func(src pointer) {
 | 
			
		||||
					sp := src.getPointer()
 | 
			
		||||
					if !sp.isNil() {
 | 
			
		||||
						di.discard(sp)
 | 
			
		||||
					}
 | 
			
		||||
		// Handle list of messages.
 | 
			
		||||
		case fd.IsList():
 | 
			
		||||
			if fd.Message() != nil {
 | 
			
		||||
				ls := m.Get(fd).List()
 | 
			
		||||
				for i := 0; i < ls.Len(); i++ {
 | 
			
		||||
					discardUnknown(ls.Get(i).Message())
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Map:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name))
 | 
			
		||||
			default: // E.g., map[K]V
 | 
			
		||||
				if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T)
 | 
			
		||||
					dfi.discard = func(src pointer) {
 | 
			
		||||
						sm := src.asPointerTo(tf).Elem()
 | 
			
		||||
						if sm.Len() == 0 {
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						for _, key := range sm.MapKeys() {
 | 
			
		||||
							val := sm.MapIndex(key)
 | 
			
		||||
							DiscardUnknown(val.Interface().(Message))
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					dfi.discard = func(pointer) {} // Noop
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Interface:
 | 
			
		||||
			// Must be oneof field.
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name))
 | 
			
		||||
			default: // E.g., interface{}
 | 
			
		||||
				// TODO: Make this faster?
 | 
			
		||||
				dfi.discard = func(src pointer) {
 | 
			
		||||
					su := src.asPointerTo(tf).Elem()
 | 
			
		||||
					if !su.IsNil() {
 | 
			
		||||
						sv := su.Elem().Elem().Field(0)
 | 
			
		||||
						if sv.Kind() == reflect.Ptr && sv.IsNil() {
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						switch sv.Type().Kind() {
 | 
			
		||||
						case reflect.Ptr: // Proto struct (e.g., *T)
 | 
			
		||||
							DiscardUnknown(sv.Interface().(Message))
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		di.fields = append(di.fields, dfi)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	di.unrecognized = invalidField
 | 
			
		||||
	if f, ok := t.FieldByName("XXX_unrecognized"); ok {
 | 
			
		||||
		if f.Type != reflect.TypeOf([]byte{}) {
 | 
			
		||||
			panic("expected XXX_unrecognized to be of type []byte")
 | 
			
		||||
		}
 | 
			
		||||
		di.unrecognized = toField(&f)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	atomic.StoreInt32(&di.initialized, 1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func discardLegacy(m Message) {
 | 
			
		||||
	v := reflect.ValueOf(m)
 | 
			
		||||
	if v.Kind() != reflect.Ptr || v.IsNil() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	v = v.Elem()
 | 
			
		||||
	if v.Kind() != reflect.Struct {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t := v.Type()
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < v.NumField(); i++ {
 | 
			
		||||
		f := t.Field(i)
 | 
			
		||||
		if strings.HasPrefix(f.Name, "XXX_") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		vf := v.Field(i)
 | 
			
		||||
		tf := f.Type
 | 
			
		||||
 | 
			
		||||
		// Unwrap tf to get its most basic type.
 | 
			
		||||
		var isPointer, isSlice bool
 | 
			
		||||
		if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 {
 | 
			
		||||
			isSlice = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if tf.Kind() == reflect.Ptr {
 | 
			
		||||
			isPointer = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if isPointer && isSlice && tf.Kind() != reflect.Struct {
 | 
			
		||||
			panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch tf.Kind() {
 | 
			
		||||
		case reflect.Struct:
 | 
			
		||||
			switch {
 | 
			
		||||
			case !isPointer:
 | 
			
		||||
				panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name))
 | 
			
		||||
			case isSlice: // E.g., []*pb.T
 | 
			
		||||
				for j := 0; j < vf.Len(); j++ {
 | 
			
		||||
					discardLegacy(vf.Index(j).Interface().(Message))
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., *pb.T
 | 
			
		||||
				discardLegacy(vf.Interface().(Message))
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Map:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name))
 | 
			
		||||
			default: // E.g., map[K]V
 | 
			
		||||
				tv := vf.Type().Elem()
 | 
			
		||||
				if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T)
 | 
			
		||||
					for _, key := range vf.MapKeys() {
 | 
			
		||||
						val := vf.MapIndex(key)
 | 
			
		||||
						discardLegacy(val.Interface().(Message))
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Interface:
 | 
			
		||||
			// Must be oneof field.
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name))
 | 
			
		||||
			default: // E.g., test_proto.isCommunique_Union interface
 | 
			
		||||
				if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" {
 | 
			
		||||
					vf = vf.Elem() // E.g., *test_proto.Communique_Msg
 | 
			
		||||
					if !vf.IsNil() {
 | 
			
		||||
						vf = vf.Elem()   // E.g., test_proto.Communique_Msg
 | 
			
		||||
						vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value
 | 
			
		||||
						if vf.Kind() == reflect.Ptr {
 | 
			
		||||
							discardLegacy(vf.Interface().(Message))
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
		// Handle map of messages.
 | 
			
		||||
		case fd.IsMap():
 | 
			
		||||
			if fd.MapValue().Message() != nil {
 | 
			
		||||
				ms := m.Get(fd).Map()
 | 
			
		||||
				ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool {
 | 
			
		||||
					discardUnknown(v.Message())
 | 
			
		||||
					return true
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() {
 | 
			
		||||
		if vf.Type() != reflect.TypeOf([]byte{}) {
 | 
			
		||||
			panic("expected XXX_unrecognized to be of type []byte")
 | 
			
		||||
		}
 | 
			
		||||
		vf.Set(reflect.ValueOf([]byte(nil)))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For proto2 messages, only discard unknown fields in message extensions
 | 
			
		||||
	// that have been accessed via GetExtension.
 | 
			
		||||
	if em, err := extendable(m); err == nil {
 | 
			
		||||
		// Ignore lock since discardLegacy is not concurrency safe.
 | 
			
		||||
		emm, _ := em.extensionsRead()
 | 
			
		||||
		for _, mx := range emm {
 | 
			
		||||
			if m, ok := mx.value.(Message); ok {
 | 
			
		||||
				discardLegacy(m)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	// Discard unknown fields.
 | 
			
		||||
	if len(m.GetUnknown()) > 0 {
 | 
			
		||||
		m.SetUnknown(nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										203
									
								
								vendor/github.com/golang/protobuf/proto/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										203
									
								
								vendor/github.com/golang/protobuf/proto/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,203 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Routines for encoding data into the wire format for protocol buffers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// errRepeatedHasNil is the error returned if Marshal is called with
 | 
			
		||||
	// a struct with a repeated field containing a nil element.
 | 
			
		||||
	errRepeatedHasNil = errors.New("proto: repeated field has nil element")
 | 
			
		||||
 | 
			
		||||
	// errOneofHasNil is the error returned if Marshal is called with
 | 
			
		||||
	// a struct with a oneof field containing a nil element.
 | 
			
		||||
	errOneofHasNil = errors.New("proto: oneof field has nil value")
 | 
			
		||||
 | 
			
		||||
	// ErrNil is the error returned if Marshal is called with nil.
 | 
			
		||||
	ErrNil = errors.New("proto: Marshal called with nil")
 | 
			
		||||
 | 
			
		||||
	// ErrTooLarge is the error returned if Marshal is called with a
 | 
			
		||||
	// message that encodes to >2GB.
 | 
			
		||||
	ErrTooLarge = errors.New("proto: message encodes to over 2 GB")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// The fundamental encoders that put bytes on the wire.
 | 
			
		||||
// Those that take integer types all accept uint64 and are
 | 
			
		||||
// therefore of type valueEncoder.
 | 
			
		||||
 | 
			
		||||
const maxVarintBytes = 10 // maximum length of a varint
 | 
			
		||||
 | 
			
		||||
// EncodeVarint returns the varint encoding of x.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// int32, int64, uint32, uint64, bool, and enum
 | 
			
		||||
// protocol buffer types.
 | 
			
		||||
// Not used by the package itself, but helpful to clients
 | 
			
		||||
// wishing to use the same encoding.
 | 
			
		||||
func EncodeVarint(x uint64) []byte {
 | 
			
		||||
	var buf [maxVarintBytes]byte
 | 
			
		||||
	var n int
 | 
			
		||||
	for n = 0; x > 127; n++ {
 | 
			
		||||
		buf[n] = 0x80 | uint8(x&0x7F)
 | 
			
		||||
		x >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	buf[n] = uint8(x)
 | 
			
		||||
	n++
 | 
			
		||||
	return buf[0:n]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeVarint writes a varint-encoded integer to the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// int32, int64, uint32, uint64, bool, and enum
 | 
			
		||||
// protocol buffer types.
 | 
			
		||||
func (p *Buffer) EncodeVarint(x uint64) error {
 | 
			
		||||
	for x >= 1<<7 {
 | 
			
		||||
		p.buf = append(p.buf, uint8(x&0x7f|0x80))
 | 
			
		||||
		x >>= 7
 | 
			
		||||
	}
 | 
			
		||||
	p.buf = append(p.buf, uint8(x))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SizeVarint returns the varint encoding size of an integer.
 | 
			
		||||
func SizeVarint(x uint64) int {
 | 
			
		||||
	switch {
 | 
			
		||||
	case x < 1<<7:
 | 
			
		||||
		return 1
 | 
			
		||||
	case x < 1<<14:
 | 
			
		||||
		return 2
 | 
			
		||||
	case x < 1<<21:
 | 
			
		||||
		return 3
 | 
			
		||||
	case x < 1<<28:
 | 
			
		||||
		return 4
 | 
			
		||||
	case x < 1<<35:
 | 
			
		||||
		return 5
 | 
			
		||||
	case x < 1<<42:
 | 
			
		||||
		return 6
 | 
			
		||||
	case x < 1<<49:
 | 
			
		||||
		return 7
 | 
			
		||||
	case x < 1<<56:
 | 
			
		||||
		return 8
 | 
			
		||||
	case x < 1<<63:
 | 
			
		||||
		return 9
 | 
			
		||||
	}
 | 
			
		||||
	return 10
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeFixed64 writes a 64-bit integer to the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// fixed64, sfixed64, and double protocol buffer types.
 | 
			
		||||
func (p *Buffer) EncodeFixed64(x uint64) error {
 | 
			
		||||
	p.buf = append(p.buf,
 | 
			
		||||
		uint8(x),
 | 
			
		||||
		uint8(x>>8),
 | 
			
		||||
		uint8(x>>16),
 | 
			
		||||
		uint8(x>>24),
 | 
			
		||||
		uint8(x>>32),
 | 
			
		||||
		uint8(x>>40),
 | 
			
		||||
		uint8(x>>48),
 | 
			
		||||
		uint8(x>>56))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeFixed32 writes a 32-bit integer to the Buffer.
 | 
			
		||||
// This is the format for the
 | 
			
		||||
// fixed32, sfixed32, and float protocol buffer types.
 | 
			
		||||
func (p *Buffer) EncodeFixed32(x uint64) error {
 | 
			
		||||
	p.buf = append(p.buf,
 | 
			
		||||
		uint8(x),
 | 
			
		||||
		uint8(x>>8),
 | 
			
		||||
		uint8(x>>16),
 | 
			
		||||
		uint8(x>>24))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeZigzag64 writes a zigzag-encoded 64-bit integer
 | 
			
		||||
// to the Buffer.
 | 
			
		||||
// This is the format used for the sint64 protocol buffer type.
 | 
			
		||||
func (p *Buffer) EncodeZigzag64(x uint64) error {
 | 
			
		||||
	// use signed number to get arithmetic right shift.
 | 
			
		||||
	return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeZigzag32 writes a zigzag-encoded 32-bit integer
 | 
			
		||||
// to the Buffer.
 | 
			
		||||
// This is the format used for the sint32 protocol buffer type.
 | 
			
		||||
func (p *Buffer) EncodeZigzag32(x uint64) error {
 | 
			
		||||
	// use signed number to get arithmetic right shift.
 | 
			
		||||
	return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeRawBytes writes a count-delimited byte buffer to the Buffer.
 | 
			
		||||
// This is the format used for the bytes protocol buffer
 | 
			
		||||
// type and for embedded messages.
 | 
			
		||||
func (p *Buffer) EncodeRawBytes(b []byte) error {
 | 
			
		||||
	p.EncodeVarint(uint64(len(b)))
 | 
			
		||||
	p.buf = append(p.buf, b...)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeStringBytes writes an encoded string to the Buffer.
 | 
			
		||||
// This is the format used for the proto2 string type.
 | 
			
		||||
func (p *Buffer) EncodeStringBytes(s string) error {
 | 
			
		||||
	p.EncodeVarint(uint64(len(s)))
 | 
			
		||||
	p.buf = append(p.buf, s...)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshaler is the interface representing objects that can marshal themselves.
 | 
			
		||||
type Marshaler interface {
 | 
			
		||||
	Marshal() ([]byte, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EncodeMessage writes the protocol buffer to the Buffer,
 | 
			
		||||
// prefixed by a varint-encoded length.
 | 
			
		||||
func (p *Buffer) EncodeMessage(pb Message) error {
 | 
			
		||||
	siz := Size(pb)
 | 
			
		||||
	p.EncodeVarint(uint64(siz))
 | 
			
		||||
	return p.Marshal(pb)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// All protocol buffer fields are nillable, but be careful.
 | 
			
		||||
func isNil(v reflect.Value) bool {
 | 
			
		||||
	switch v.Kind() {
 | 
			
		||||
	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
 | 
			
		||||
		return v.IsNil()
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										301
									
								
								vendor/github.com/golang/protobuf/proto/equal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										301
									
								
								vendor/github.com/golang/protobuf/proto/equal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,301 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2011 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// Protocol buffer comparison.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Equal returns true iff protocol buffers a and b are equal.
 | 
			
		||||
The arguments must both be pointers to protocol buffer structs.
 | 
			
		||||
 | 
			
		||||
Equality is defined in this way:
 | 
			
		||||
  - Two messages are equal iff they are the same type,
 | 
			
		||||
    corresponding fields are equal, unknown field sets
 | 
			
		||||
    are equal, and extensions sets are equal.
 | 
			
		||||
  - Two set scalar fields are equal iff their values are equal.
 | 
			
		||||
    If the fields are of a floating-point type, remember that
 | 
			
		||||
    NaN != x for all x, including NaN. If the message is defined
 | 
			
		||||
    in a proto3 .proto file, fields are not "set"; specifically,
 | 
			
		||||
    zero length proto3 "bytes" fields are equal (nil == {}).
 | 
			
		||||
  - Two repeated fields are equal iff their lengths are the same,
 | 
			
		||||
    and their corresponding elements are equal. Note a "bytes" field,
 | 
			
		||||
    although represented by []byte, is not a repeated field and the
 | 
			
		||||
    rule for the scalar fields described above applies.
 | 
			
		||||
  - Two unset fields are equal.
 | 
			
		||||
  - Two unknown field sets are equal if their current
 | 
			
		||||
    encoded state is equal.
 | 
			
		||||
  - Two extension sets are equal iff they have corresponding
 | 
			
		||||
    elements that are pairwise equal.
 | 
			
		||||
  - Two map fields are equal iff their lengths are the same,
 | 
			
		||||
    and they contain the same set of elements. Zero-length map
 | 
			
		||||
    fields are equal.
 | 
			
		||||
  - Every other combination of things are not equal.
 | 
			
		||||
 | 
			
		||||
The return value is undefined if a and b are not protocol buffers.
 | 
			
		||||
*/
 | 
			
		||||
func Equal(a, b Message) bool {
 | 
			
		||||
	if a == nil || b == nil {
 | 
			
		||||
		return a == b
 | 
			
		||||
	}
 | 
			
		||||
	v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b)
 | 
			
		||||
	if v1.Type() != v2.Type() {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if v1.Kind() == reflect.Ptr {
 | 
			
		||||
		if v1.IsNil() {
 | 
			
		||||
			return v2.IsNil()
 | 
			
		||||
		}
 | 
			
		||||
		if v2.IsNil() {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		v1, v2 = v1.Elem(), v2.Elem()
 | 
			
		||||
	}
 | 
			
		||||
	if v1.Kind() != reflect.Struct {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return equalStruct(v1, v2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// v1 and v2 are known to have the same type.
 | 
			
		||||
func equalStruct(v1, v2 reflect.Value) bool {
 | 
			
		||||
	sprop := GetProperties(v1.Type())
 | 
			
		||||
	for i := 0; i < v1.NumField(); i++ {
 | 
			
		||||
		f := v1.Type().Field(i)
 | 
			
		||||
		if strings.HasPrefix(f.Name, "XXX_") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		f1, f2 := v1.Field(i), v2.Field(i)
 | 
			
		||||
		if f.Type.Kind() == reflect.Ptr {
 | 
			
		||||
			if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 {
 | 
			
		||||
				// both unset
 | 
			
		||||
				continue
 | 
			
		||||
			} else if n1 != n2 {
 | 
			
		||||
				// set/unset mismatch
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			f1, f2 = f1.Elem(), f2.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if !equalAny(f1, f2, sprop.Prop[i]) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() {
 | 
			
		||||
		em2 := v2.FieldByName("XXX_InternalExtensions")
 | 
			
		||||
		if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() {
 | 
			
		||||
		em2 := v2.FieldByName("XXX_extensions")
 | 
			
		||||
		if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	uf := v1.FieldByName("XXX_unrecognized")
 | 
			
		||||
	if !uf.IsValid() {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u1 := uf.Bytes()
 | 
			
		||||
	u2 := v2.FieldByName("XXX_unrecognized").Bytes()
 | 
			
		||||
	return bytes.Equal(u1, u2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// v1 and v2 are known to have the same type.
 | 
			
		||||
// prop may be nil.
 | 
			
		||||
func equalAny(v1, v2 reflect.Value, prop *Properties) bool {
 | 
			
		||||
	if v1.Type() == protoMessageType {
 | 
			
		||||
		m1, _ := v1.Interface().(Message)
 | 
			
		||||
		m2, _ := v2.Interface().(Message)
 | 
			
		||||
		return Equal(m1, m2)
 | 
			
		||||
	}
 | 
			
		||||
	switch v1.Kind() {
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		return v1.Bool() == v2.Bool()
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		return v1.Float() == v2.Float()
 | 
			
		||||
	case reflect.Int32, reflect.Int64:
 | 
			
		||||
		return v1.Int() == v2.Int()
 | 
			
		||||
	case reflect.Interface:
 | 
			
		||||
		// Probably a oneof field; compare the inner values.
 | 
			
		||||
		n1, n2 := v1.IsNil(), v2.IsNil()
 | 
			
		||||
		if n1 || n2 {
 | 
			
		||||
			return n1 == n2
 | 
			
		||||
		}
 | 
			
		||||
		e1, e2 := v1.Elem(), v2.Elem()
 | 
			
		||||
		if e1.Type() != e2.Type() {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		return equalAny(e1, e2, nil)
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		if v1.Len() != v2.Len() {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		for _, key := range v1.MapKeys() {
 | 
			
		||||
			val2 := v2.MapIndex(key)
 | 
			
		||||
			if !val2.IsValid() {
 | 
			
		||||
				// This key was not found in the second map.
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			if !equalAny(v1.MapIndex(key), val2, nil) {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		// Maps may have nil values in them, so check for nil.
 | 
			
		||||
		if v1.IsNil() && v2.IsNil() {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		if v1.IsNil() != v2.IsNil() {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		return equalAny(v1.Elem(), v2.Elem(), prop)
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		if v1.Type().Elem().Kind() == reflect.Uint8 {
 | 
			
		||||
			// short circuit: []byte
 | 
			
		||||
 | 
			
		||||
			// Edge case: if this is in a proto3 message, a zero length
 | 
			
		||||
			// bytes field is considered the zero value.
 | 
			
		||||
			if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			if v1.IsNil() != v2.IsNil() {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if v1.Len() != v2.Len() {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		for i := 0; i < v1.Len(); i++ {
 | 
			
		||||
			if !equalAny(v1.Index(i), v2.Index(i), prop) {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		return v1.Interface().(string) == v2.Interface().(string)
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		return equalStruct(v1, v2)
 | 
			
		||||
	case reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		return v1.Uint() == v2.Uint()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// unknown type, so not a protocol buffer
 | 
			
		||||
	log.Printf("proto: don't know how to compare %v", v1)
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// base is the struct type that the extensions are based on.
 | 
			
		||||
// x1 and x2 are InternalExtensions.
 | 
			
		||||
func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool {
 | 
			
		||||
	em1, _ := x1.extensionsRead()
 | 
			
		||||
	em2, _ := x2.extensionsRead()
 | 
			
		||||
	return equalExtMap(base, em1, em2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {
 | 
			
		||||
	if len(em1) != len(em2) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for extNum, e1 := range em1 {
 | 
			
		||||
		e2, ok := em2[extNum]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m1 := extensionAsLegacyType(e1.value)
 | 
			
		||||
		m2 := extensionAsLegacyType(e2.value)
 | 
			
		||||
 | 
			
		||||
		if m1 == nil && m2 == nil {
 | 
			
		||||
			// Both have only encoded form.
 | 
			
		||||
			if bytes.Equal(e1.enc, e2.enc) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			// The bytes are different, but the extensions might still be
 | 
			
		||||
			// equal. We need to decode them to compare.
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if m1 != nil && m2 != nil {
 | 
			
		||||
			// Both are unencoded.
 | 
			
		||||
			if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// At least one is encoded. To do a semantically correct comparison
 | 
			
		||||
		// we need to unmarshal them first.
 | 
			
		||||
		var desc *ExtensionDesc
 | 
			
		||||
		if m := extensionMaps[base]; m != nil {
 | 
			
		||||
			desc = m[extNum]
 | 
			
		||||
		}
 | 
			
		||||
		if desc == nil {
 | 
			
		||||
			// If both have only encoded form and the bytes are the same,
 | 
			
		||||
			// it is handled above. We get here when the bytes are different.
 | 
			
		||||
			// We don't know how to decode it, so just compare them as byte
 | 
			
		||||
			// slices.
 | 
			
		||||
			log.Printf("proto: don't know how to compare extension %d of %v", extNum, base)
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		var err error
 | 
			
		||||
		if m1 == nil {
 | 
			
		||||
			m1, err = decodeExtension(e1.enc, desc)
 | 
			
		||||
		}
 | 
			
		||||
		if m2 == nil && err == nil {
 | 
			
		||||
			m2, err = decodeExtension(e2.enc, desc)
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			// The encoded form is invalid.
 | 
			
		||||
			log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err)
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										845
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										845
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,607 +1,356 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Types and routines for supporting protocol buffer extensions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
			
		||||
	"google.golang.org/protobuf/proto"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message.
 | 
			
		||||
type (
 | 
			
		||||
	// ExtensionDesc represents an extension descriptor and
 | 
			
		||||
	// is used to interact with an extension field in a message.
 | 
			
		||||
	//
 | 
			
		||||
	// Variables of this type are generated in code by protoc-gen-go.
 | 
			
		||||
	ExtensionDesc = protoimpl.ExtensionInfo
 | 
			
		||||
 | 
			
		||||
	// ExtensionRange represents a range of message extensions.
 | 
			
		||||
	// Used in code generated by protoc-gen-go.
 | 
			
		||||
	ExtensionRange = protoiface.ExtensionRangeV1
 | 
			
		||||
 | 
			
		||||
	// Deprecated: Do not use; this is an internal type.
 | 
			
		||||
	Extension = protoimpl.ExtensionFieldV1
 | 
			
		||||
 | 
			
		||||
	// Deprecated: Do not use; this is an internal type.
 | 
			
		||||
	XXX_InternalExtensions = protoimpl.ExtensionFields
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ErrMissingExtension reports whether the extension was not present.
 | 
			
		||||
var ErrMissingExtension = errors.New("proto: missing extension")
 | 
			
		||||
 | 
			
		||||
// ExtensionRange represents a range of message extensions for a protocol buffer.
 | 
			
		||||
// Used in code generated by the protocol compiler.
 | 
			
		||||
type ExtensionRange struct {
 | 
			
		||||
	Start, End int32 // both inclusive
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extendableProto is an interface implemented by any protocol buffer generated by the current
 | 
			
		||||
// proto compiler that may be extended.
 | 
			
		||||
type extendableProto interface {
 | 
			
		||||
	Message
 | 
			
		||||
	ExtensionRangeArray() []ExtensionRange
 | 
			
		||||
	extensionsWrite() map[int32]Extension
 | 
			
		||||
	extensionsRead() (map[int32]Extension, sync.Locker)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous
 | 
			
		||||
// version of the proto compiler that may be extended.
 | 
			
		||||
type extendableProtoV1 interface {
 | 
			
		||||
	Message
 | 
			
		||||
	ExtensionRangeArray() []ExtensionRange
 | 
			
		||||
	ExtensionMap() map[int32]Extension
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto.
 | 
			
		||||
type extensionAdapter struct {
 | 
			
		||||
	extendableProtoV1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e extensionAdapter) extensionsWrite() map[int32]Extension {
 | 
			
		||||
	return e.ExtensionMap()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) {
 | 
			
		||||
	return e.ExtensionMap(), notLocker{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// notLocker is a sync.Locker whose Lock and Unlock methods are nops.
 | 
			
		||||
type notLocker struct{}
 | 
			
		||||
 | 
			
		||||
func (n notLocker) Lock()   {}
 | 
			
		||||
func (n notLocker) Unlock() {}
 | 
			
		||||
 | 
			
		||||
// extendable returns the extendableProto interface for the given generated proto message.
 | 
			
		||||
// If the proto message has the old extension format, it returns a wrapper that implements
 | 
			
		||||
// the extendableProto interface.
 | 
			
		||||
func extendable(p interface{}) (extendableProto, error) {
 | 
			
		||||
	switch p := p.(type) {
 | 
			
		||||
	case extendableProto:
 | 
			
		||||
		if isNilPtr(p) {
 | 
			
		||||
			return nil, fmt.Errorf("proto: nil %T is not extendable", p)
 | 
			
		||||
		}
 | 
			
		||||
		return p, nil
 | 
			
		||||
	case extendableProtoV1:
 | 
			
		||||
		if isNilPtr(p) {
 | 
			
		||||
			return nil, fmt.Errorf("proto: nil %T is not extendable", p)
 | 
			
		||||
		}
 | 
			
		||||
		return extensionAdapter{p}, nil
 | 
			
		||||
	}
 | 
			
		||||
	// Don't allocate a specific error containing %T:
 | 
			
		||||
	// this is the hot path for Clone and MarshalText.
 | 
			
		||||
	return nil, errNotExtendable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var errNotExtendable = errors.New("proto: not an extendable proto.Message")
 | 
			
		||||
 | 
			
		||||
func isNilPtr(x interface{}) bool {
 | 
			
		||||
	v := reflect.ValueOf(x)
 | 
			
		||||
	return v.Kind() == reflect.Ptr && v.IsNil()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// XXX_InternalExtensions is an internal representation of proto extensions.
 | 
			
		||||
//
 | 
			
		||||
// Each generated message struct type embeds an anonymous XXX_InternalExtensions field,
 | 
			
		||||
// thus gaining the unexported 'extensions' method, which can be called only from the proto package.
 | 
			
		||||
//
 | 
			
		||||
// The methods of XXX_InternalExtensions are not concurrency safe in general,
 | 
			
		||||
// but calls to logically read-only methods such as has and get may be executed concurrently.
 | 
			
		||||
type XXX_InternalExtensions struct {
 | 
			
		||||
	// The struct must be indirect so that if a user inadvertently copies a
 | 
			
		||||
	// generated message and its embedded XXX_InternalExtensions, they
 | 
			
		||||
	// avoid the mayhem of a copied mutex.
 | 
			
		||||
	//
 | 
			
		||||
	// The mutex serializes all logically read-only operations to p.extensionMap.
 | 
			
		||||
	// It is up to the client to ensure that write operations to p.extensionMap are
 | 
			
		||||
	// mutually exclusive with other accesses.
 | 
			
		||||
	p *struct {
 | 
			
		||||
		mu           sync.Mutex
 | 
			
		||||
		extensionMap map[int32]Extension
 | 
			
		||||
// HasExtension reports whether the extension field is present in m
 | 
			
		||||
// either as an explicitly populated field or as an unknown field.
 | 
			
		||||
func HasExtension(m Message, xt *ExtensionDesc) (has bool) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extensionsWrite returns the extension map, creating it on first use.
 | 
			
		||||
func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension {
 | 
			
		||||
	if e.p == nil {
 | 
			
		||||
		e.p = new(struct {
 | 
			
		||||
			mu           sync.Mutex
 | 
			
		||||
			extensionMap map[int32]Extension
 | 
			
		||||
	// Check whether any populated known field matches the field number.
 | 
			
		||||
	xtd := xt.TypeDescriptor()
 | 
			
		||||
	if isValidExtension(mr.Descriptor(), xtd) {
 | 
			
		||||
		has = mr.Has(xtd)
 | 
			
		||||
	} else {
 | 
			
		||||
		mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
			
		||||
			has = int32(fd.Number()) == xt.Field
 | 
			
		||||
			return !has
 | 
			
		||||
		})
 | 
			
		||||
		e.p.extensionMap = make(map[int32]Extension)
 | 
			
		||||
	}
 | 
			
		||||
	return e.p.extensionMap
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extensionsRead returns the extensions map for read-only use.  It may be nil.
 | 
			
		||||
// The caller must hold the returned mutex's lock when accessing Elements within the map.
 | 
			
		||||
func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) {
 | 
			
		||||
	if e.p == nil {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	// Check whether any unknown field matches the field number.
 | 
			
		||||
	for b := mr.GetUnknown(); !has && len(b) > 0; {
 | 
			
		||||
		num, _, n := protowire.ConsumeField(b)
 | 
			
		||||
		has = int32(num) == xt.Field
 | 
			
		||||
		b = b[n:]
 | 
			
		||||
	}
 | 
			
		||||
	return e.p.extensionMap, &e.p.mu
 | 
			
		||||
	return has
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExtensionDesc represents an extension specification.
 | 
			
		||||
// Used in generated code from the protocol compiler.
 | 
			
		||||
type ExtensionDesc struct {
 | 
			
		||||
	ExtendedType  Message     // nil pointer to the type that is being extended
 | 
			
		||||
	ExtensionType interface{} // nil pointer to the extension type
 | 
			
		||||
	Field         int32       // field number
 | 
			
		||||
	Name          string      // fully-qualified name of extension, for text formatting
 | 
			
		||||
	Tag           string      // protobuf tag style
 | 
			
		||||
	Filename      string      // name of the file in which the extension is defined
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ed *ExtensionDesc) repeated() bool {
 | 
			
		||||
	t := reflect.TypeOf(ed.ExtensionType)
 | 
			
		||||
	return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Extension represents an extension in a message.
 | 
			
		||||
type Extension struct {
 | 
			
		||||
	// When an extension is stored in a message using SetExtension
 | 
			
		||||
	// only desc and value are set. When the message is marshaled
 | 
			
		||||
	// enc will be set to the encoded form of the message.
 | 
			
		||||
	//
 | 
			
		||||
	// When a message is unmarshaled and contains extensions, each
 | 
			
		||||
	// extension will have only enc set. When such an extension is
 | 
			
		||||
	// accessed using GetExtension (or GetExtensions) desc and value
 | 
			
		||||
	// will be set.
 | 
			
		||||
	desc *ExtensionDesc
 | 
			
		||||
 | 
			
		||||
	// value is a concrete value for the extension field. Let the type of
 | 
			
		||||
	// desc.ExtensionType be the "API type" and the type of Extension.value
 | 
			
		||||
	// be the "storage type". The API type and storage type are the same except:
 | 
			
		||||
	//	* For scalars (except []byte), the API type uses *T,
 | 
			
		||||
	//	while the storage type uses T.
 | 
			
		||||
	//	* For repeated fields, the API type uses []T, while the storage type
 | 
			
		||||
	//	uses *[]T.
 | 
			
		||||
	//
 | 
			
		||||
	// The reason for the divergence is so that the storage type more naturally
 | 
			
		||||
	// matches what is expected of when retrieving the values through the
 | 
			
		||||
	// protobuf reflection APIs.
 | 
			
		||||
	//
 | 
			
		||||
	// The value may only be populated if desc is also populated.
 | 
			
		||||
	value interface{}
 | 
			
		||||
 | 
			
		||||
	// enc is the raw bytes for the extension field.
 | 
			
		||||
	enc []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetRawExtension is for testing only.
 | 
			
		||||
func SetRawExtension(base Message, id int32, b []byte) {
 | 
			
		||||
	epb, err := extendable(base)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
// ClearExtension removes the extension field from m
 | 
			
		||||
// either as an explicitly populated field or as an unknown field.
 | 
			
		||||
func ClearExtension(m Message, xt *ExtensionDesc) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	extmap := epb.extensionsWrite()
 | 
			
		||||
	extmap[id] = Extension{enc: b}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isExtensionField returns true iff the given field number is in an extension range.
 | 
			
		||||
func isExtensionField(pb extendableProto, field int32) bool {
 | 
			
		||||
	for _, er := range pb.ExtensionRangeArray() {
 | 
			
		||||
		if er.Start <= field && field <= er.End {
 | 
			
		||||
	xtd := xt.TypeDescriptor()
 | 
			
		||||
	if isValidExtension(mr.Descriptor(), xtd) {
 | 
			
		||||
		mr.Clear(xtd)
 | 
			
		||||
	} else {
 | 
			
		||||
		mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
			
		||||
			if int32(fd.Number()) == xt.Field {
 | 
			
		||||
				mr.Clear(fd)
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
	clearUnknown(mr, fieldNum(xt.Field))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// checkExtensionTypes checks that the given extension is valid for pb.
 | 
			
		||||
func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error {
 | 
			
		||||
	var pbi interface{} = pb
 | 
			
		||||
	// Check the extended type.
 | 
			
		||||
	if ea, ok := pbi.(extensionAdapter); ok {
 | 
			
		||||
		pbi = ea.extendableProtoV1
 | 
			
		||||
	}
 | 
			
		||||
	if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b {
 | 
			
		||||
		return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a)
 | 
			
		||||
	}
 | 
			
		||||
	// Check the range.
 | 
			
		||||
	if !isExtensionField(pb, extension.Field) {
 | 
			
		||||
		return errors.New("proto: bad extension number; not in declared ranges")
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extPropKey is sufficient to uniquely identify an extension.
 | 
			
		||||
type extPropKey struct {
 | 
			
		||||
	base  reflect.Type
 | 
			
		||||
	field int32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var extProp = struct {
 | 
			
		||||
	sync.RWMutex
 | 
			
		||||
	m map[extPropKey]*Properties
 | 
			
		||||
}{
 | 
			
		||||
	m: make(map[extPropKey]*Properties),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func extensionProperties(ed *ExtensionDesc) *Properties {
 | 
			
		||||
	key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field}
 | 
			
		||||
 | 
			
		||||
	extProp.RLock()
 | 
			
		||||
	if prop, ok := extProp.m[key]; ok {
 | 
			
		||||
		extProp.RUnlock()
 | 
			
		||||
		return prop
 | 
			
		||||
	}
 | 
			
		||||
	extProp.RUnlock()
 | 
			
		||||
 | 
			
		||||
	extProp.Lock()
 | 
			
		||||
	defer extProp.Unlock()
 | 
			
		||||
	// Check again.
 | 
			
		||||
	if prop, ok := extProp.m[key]; ok {
 | 
			
		||||
		return prop
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	prop := new(Properties)
 | 
			
		||||
	prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil)
 | 
			
		||||
	extProp.m[key] = prop
 | 
			
		||||
	return prop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HasExtension returns whether the given extension is present in pb.
 | 
			
		||||
func HasExtension(pb Message, extension *ExtensionDesc) bool {
 | 
			
		||||
	// TODO: Check types, field numbers, etc.?
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	extmap, mu := epb.extensionsRead()
 | 
			
		||||
	if extmap == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	_, ok := extmap[extension.Field]
 | 
			
		||||
	mu.Unlock()
 | 
			
		||||
	return ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ClearExtension removes the given extension from pb.
 | 
			
		||||
func ClearExtension(pb Message, extension *ExtensionDesc) {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
// ClearAllExtensions clears all extensions from m.
 | 
			
		||||
// This includes populated fields and unknown fields in the extension range.
 | 
			
		||||
func ClearAllExtensions(m Message) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: Check types, field numbers, etc.?
 | 
			
		||||
	extmap := epb.extensionsWrite()
 | 
			
		||||
	delete(extmap, extension.Field)
 | 
			
		||||
 | 
			
		||||
	mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
			
		||||
		if fd.IsExtension() {
 | 
			
		||||
			mr.Clear(fd)
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
	clearUnknown(mr, mr.Descriptor().ExtensionRanges())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetExtension retrieves a proto2 extended field from pb.
 | 
			
		||||
// GetExtension retrieves a proto2 extended field from m.
 | 
			
		||||
//
 | 
			
		||||
// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil),
 | 
			
		||||
// then GetExtension parses the encoded field and returns a Go value of the specified type.
 | 
			
		||||
// If the field is not present, then the default value is returned (if one is specified),
 | 
			
		||||
// otherwise ErrMissingExtension is reported.
 | 
			
		||||
//
 | 
			
		||||
// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil),
 | 
			
		||||
// then GetExtension returns the raw encoded bytes of the field extension.
 | 
			
		||||
func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
// If the descriptor is type incomplete (i.e., ExtensionDesc.ExtensionType is nil),
 | 
			
		||||
// then GetExtension returns the raw encoded bytes for the extension field.
 | 
			
		||||
func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
			
		||||
		return nil, errNotExtendable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if extension.ExtendedType != nil {
 | 
			
		||||
		// can only check type if this is a complete descriptor
 | 
			
		||||
		if err := checkExtensionTypes(epb, extension); err != nil {
 | 
			
		||||
	// Retrieve the unknown fields for this extension field.
 | 
			
		||||
	var bo protoreflect.RawFields
 | 
			
		||||
	for bi := mr.GetUnknown(); len(bi) > 0; {
 | 
			
		||||
		num, _, n := protowire.ConsumeField(bi)
 | 
			
		||||
		if int32(num) == xt.Field {
 | 
			
		||||
			bo = append(bo, bi[:n]...)
 | 
			
		||||
		}
 | 
			
		||||
		bi = bi[n:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For type incomplete descriptors, only retrieve the unknown fields.
 | 
			
		||||
	if xt.ExtensionType == nil {
 | 
			
		||||
		return []byte(bo), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the extension field only exists as unknown fields, unmarshal it.
 | 
			
		||||
	// This is rarely done since proto.Unmarshal eagerly unmarshals extensions.
 | 
			
		||||
	xtd := xt.TypeDescriptor()
 | 
			
		||||
	if !isValidExtension(mr.Descriptor(), xtd) {
 | 
			
		||||
		return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m)
 | 
			
		||||
	}
 | 
			
		||||
	if !mr.Has(xtd) && len(bo) > 0 {
 | 
			
		||||
		m2 := mr.New()
 | 
			
		||||
		if err := (proto.UnmarshalOptions{
 | 
			
		||||
			Resolver: extensionResolver{xt},
 | 
			
		||||
		}.Unmarshal(bo, m2.Interface())); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	emap, mu := epb.extensionsRead()
 | 
			
		||||
	if emap == nil {
 | 
			
		||||
		return defaultExtensionValue(extension)
 | 
			
		||||
	}
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	defer mu.Unlock()
 | 
			
		||||
	e, ok := emap[extension.Field]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		// defaultExtensionValue returns the default value or
 | 
			
		||||
		// ErrMissingExtension if there is no default.
 | 
			
		||||
		return defaultExtensionValue(extension)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if e.value != nil {
 | 
			
		||||
		// Already decoded. Check the descriptor, though.
 | 
			
		||||
		if e.desc != extension {
 | 
			
		||||
			// This shouldn't happen. If it does, it means that
 | 
			
		||||
			// GetExtension was called twice with two different
 | 
			
		||||
			// descriptors with the same field number.
 | 
			
		||||
			return nil, errors.New("proto: descriptor conflict")
 | 
			
		||||
		if m2.Has(xtd) {
 | 
			
		||||
			mr.Set(xtd, m2.Get(xtd))
 | 
			
		||||
			clearUnknown(mr, fieldNum(xt.Field))
 | 
			
		||||
		}
 | 
			
		||||
		return extensionAsLegacyType(e.value), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if extension.ExtensionType == nil {
 | 
			
		||||
		// incomplete descriptor
 | 
			
		||||
		return e.enc, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	v, err := decodeExtension(e.enc, extension)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remember the decoded version and drop the encoded version.
 | 
			
		||||
	// That way it is safe to mutate what we return.
 | 
			
		||||
	e.value = extensionAsStorageType(v)
 | 
			
		||||
	e.desc = extension
 | 
			
		||||
	e.enc = nil
 | 
			
		||||
	emap[extension.Field] = e
 | 
			
		||||
	return extensionAsLegacyType(e.value), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// defaultExtensionValue returns the default value for extension.
 | 
			
		||||
// If no default for an extension is defined ErrMissingExtension is returned.
 | 
			
		||||
func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) {
 | 
			
		||||
	if extension.ExtensionType == nil {
 | 
			
		||||
		// incomplete descriptor, so no default
 | 
			
		||||
	// Check whether the message has the extension field set or a default.
 | 
			
		||||
	var pv protoreflect.Value
 | 
			
		||||
	switch {
 | 
			
		||||
	case mr.Has(xtd):
 | 
			
		||||
		pv = mr.Get(xtd)
 | 
			
		||||
	case xtd.HasDefault():
 | 
			
		||||
		pv = xtd.Default()
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, ErrMissingExtension
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t := reflect.TypeOf(extension.ExtensionType)
 | 
			
		||||
	props := extensionProperties(extension)
 | 
			
		||||
 | 
			
		||||
	sf, _, err := fieldDefault(t, props)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if sf == nil || sf.value == nil {
 | 
			
		||||
		// There is no default value.
 | 
			
		||||
		return nil, ErrMissingExtension
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if t.Kind() != reflect.Ptr {
 | 
			
		||||
		// We do not need to return a Ptr, we can directly return sf.value.
 | 
			
		||||
		return sf.value, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We need to return an interface{} that is a pointer to sf.value.
 | 
			
		||||
	value := reflect.New(t).Elem()
 | 
			
		||||
	value.Set(reflect.New(value.Type().Elem()))
 | 
			
		||||
	if sf.kind == reflect.Int32 {
 | 
			
		||||
		// We may have an int32 or an enum, but the underlying data is int32.
 | 
			
		||||
		// Since we can't set an int32 into a non int32 reflect.value directly
 | 
			
		||||
		// set it as a int32.
 | 
			
		||||
		value.Elem().SetInt(int64(sf.value.(int32)))
 | 
			
		||||
	} else {
 | 
			
		||||
		value.Elem().Set(reflect.ValueOf(sf.value))
 | 
			
		||||
	}
 | 
			
		||||
	return value.Interface(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// decodeExtension decodes an extension encoded in b.
 | 
			
		||||
func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) {
 | 
			
		||||
	t := reflect.TypeOf(extension.ExtensionType)
 | 
			
		||||
	unmarshal := typeUnmarshaler(t, extension.Tag)
 | 
			
		||||
 | 
			
		||||
	// t is a pointer to a struct, pointer to basic type or a slice.
 | 
			
		||||
	// Allocate space to store the pointer/slice.
 | 
			
		||||
	value := reflect.New(t).Elem()
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	for {
 | 
			
		||||
		x, n := decodeVarint(b)
 | 
			
		||||
		if n == 0 {
 | 
			
		||||
			return nil, io.ErrUnexpectedEOF
 | 
			
		||||
		}
 | 
			
		||||
		b = b[n:]
 | 
			
		||||
		wire := int(x) & 7
 | 
			
		||||
 | 
			
		||||
		b, err = unmarshal(b, valToPointer(value.Addr()), wire)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if len(b) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return value.Interface(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetExtensions returns a slice of the extensions present in pb that are also listed in es.
 | 
			
		||||
// The returned slice has the same length as es; missing extensions will appear as nil elements.
 | 
			
		||||
func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	extensions = make([]interface{}, len(es))
 | 
			
		||||
	for i, e := range es {
 | 
			
		||||
		extensions[i], err = GetExtension(epb, e)
 | 
			
		||||
		if err == ErrMissingExtension {
 | 
			
		||||
			err = nil
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order.
 | 
			
		||||
// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing
 | 
			
		||||
// just the Field field, which defines the extension's field number.
 | 
			
		||||
func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	registeredExtensions := RegisteredExtensions(pb)
 | 
			
		||||
 | 
			
		||||
	emap, mu := epb.extensionsRead()
 | 
			
		||||
	if emap == nil {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	defer mu.Unlock()
 | 
			
		||||
	extensions := make([]*ExtensionDesc, 0, len(emap))
 | 
			
		||||
	for extid, e := range emap {
 | 
			
		||||
		desc := e.desc
 | 
			
		||||
		if desc == nil {
 | 
			
		||||
			desc = registeredExtensions[extid]
 | 
			
		||||
			if desc == nil {
 | 
			
		||||
				desc = &ExtensionDesc{Field: extid}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		extensions = append(extensions, desc)
 | 
			
		||||
	}
 | 
			
		||||
	return extensions, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetExtension sets the specified extension of pb to the specified value.
 | 
			
		||||
func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := checkExtensionTypes(epb, extension); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	typ := reflect.TypeOf(extension.ExtensionType)
 | 
			
		||||
	if typ != reflect.TypeOf(value) {
 | 
			
		||||
		return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", value, extension.ExtensionType)
 | 
			
		||||
	}
 | 
			
		||||
	// nil extension values need to be caught early, because the
 | 
			
		||||
	// encoder can't distinguish an ErrNil due to a nil extension
 | 
			
		||||
	// from an ErrNil due to a missing field. Extensions are
 | 
			
		||||
	// always optional, so the encoder would just swallow the error
 | 
			
		||||
	// and drop all the extensions from the encoded message.
 | 
			
		||||
	if reflect.ValueOf(value).IsNil() {
 | 
			
		||||
		return fmt.Errorf("proto: SetExtension called with nil value of type %T", value)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	extmap := epb.extensionsWrite()
 | 
			
		||||
	extmap[extension.Field] = Extension{desc: extension, value: extensionAsStorageType(value)}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ClearAllExtensions clears all extensions from pb.
 | 
			
		||||
func ClearAllExtensions(pb Message) {
 | 
			
		||||
	epb, err := extendable(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	m := epb.extensionsWrite()
 | 
			
		||||
	for k := range m {
 | 
			
		||||
		delete(m, k)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A global registry of extensions.
 | 
			
		||||
// The generated code will register the generated descriptors by calling RegisterExtension.
 | 
			
		||||
 | 
			
		||||
var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc)
 | 
			
		||||
 | 
			
		||||
// RegisterExtension is called from the generated code.
 | 
			
		||||
func RegisterExtension(desc *ExtensionDesc) {
 | 
			
		||||
	st := reflect.TypeOf(desc.ExtendedType).Elem()
 | 
			
		||||
	m := extensionMaps[st]
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		m = make(map[int32]*ExtensionDesc)
 | 
			
		||||
		extensionMaps[st] = m
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := m[desc.Field]; ok {
 | 
			
		||||
		panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field)))
 | 
			
		||||
	}
 | 
			
		||||
	m[desc.Field] = desc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisteredExtensions returns a map of the registered extensions of a
 | 
			
		||||
// protocol buffer struct, indexed by the extension number.
 | 
			
		||||
// The argument pb should be a nil pointer to the struct type.
 | 
			
		||||
func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc {
 | 
			
		||||
	return extensionMaps[reflect.TypeOf(pb).Elem()]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extensionAsLegacyType converts an value in the storage type as the API type.
 | 
			
		||||
// See Extension.value.
 | 
			
		||||
func extensionAsLegacyType(v interface{}) interface{} {
 | 
			
		||||
	switch rv := reflect.ValueOf(v); rv.Kind() {
 | 
			
		||||
	case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
 | 
			
		||||
		// Represent primitive types as a pointer to the value.
 | 
			
		||||
	v := xt.InterfaceOf(pv)
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if isScalarKind(rv.Kind()) {
 | 
			
		||||
		rv2 := reflect.New(rv.Type())
 | 
			
		||||
		rv2.Elem().Set(rv)
 | 
			
		||||
		v = rv2.Interface()
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		// Represent slice types as the value itself.
 | 
			
		||||
		switch rv.Type().Elem().Kind() {
 | 
			
		||||
		case reflect.Slice:
 | 
			
		||||
			if rv.IsNil() {
 | 
			
		||||
				v = reflect.Zero(rv.Type().Elem()).Interface()
 | 
			
		||||
			} else {
 | 
			
		||||
				v = rv.Elem().Interface()
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return v
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// extensionAsStorageType converts an value in the API type as the storage type.
 | 
			
		||||
// See Extension.value.
 | 
			
		||||
func extensionAsStorageType(v interface{}) interface{} {
 | 
			
		||||
	switch rv := reflect.ValueOf(v); rv.Kind() {
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		// Represent slice types as the value itself.
 | 
			
		||||
		switch rv.Type().Elem().Kind() {
 | 
			
		||||
		case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
 | 
			
		||||
			if rv.IsNil() {
 | 
			
		||||
				v = reflect.Zero(rv.Type().Elem()).Interface()
 | 
			
		||||
			} else {
 | 
			
		||||
				v = rv.Elem().Interface()
 | 
			
		||||
// extensionResolver is a custom extension resolver that stores a single
 | 
			
		||||
// extension type that takes precedence over the global registry.
 | 
			
		||||
type extensionResolver struct{ xt protoreflect.ExtensionType }
 | 
			
		||||
 | 
			
		||||
func (r extensionResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
 | 
			
		||||
	if xtd := r.xt.TypeDescriptor(); xtd.FullName() == field {
 | 
			
		||||
		return r.xt, nil
 | 
			
		||||
	}
 | 
			
		||||
	return protoregistry.GlobalTypes.FindExtensionByName(field)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r extensionResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
 | 
			
		||||
	if xtd := r.xt.TypeDescriptor(); xtd.ContainingMessage().FullName() == message && xtd.Number() == field {
 | 
			
		||||
		return r.xt, nil
 | 
			
		||||
	}
 | 
			
		||||
	return protoregistry.GlobalTypes.FindExtensionByNumber(message, field)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetExtensions returns a list of the extensions values present in m,
 | 
			
		||||
// corresponding with the provided list of extension descriptors, xts.
 | 
			
		||||
// If an extension is missing in m, the corresponding value is nil.
 | 
			
		||||
func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return nil, errNotExtendable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	vs := make([]interface{}, len(xts))
 | 
			
		||||
	for i, xt := range xts {
 | 
			
		||||
		v, err := GetExtension(m, xt)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == ErrMissingExtension {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return vs, err
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		// Represent slice types as a pointer to the value.
 | 
			
		||||
		if rv.Type().Elem().Kind() != reflect.Uint8 {
 | 
			
		||||
			rv2 := reflect.New(rv.Type())
 | 
			
		||||
			rv2.Elem().Set(rv)
 | 
			
		||||
			v = rv2.Interface()
 | 
			
		||||
		vs[i] = v
 | 
			
		||||
	}
 | 
			
		||||
	return vs, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetExtension sets an extension field in m to the provided value.
 | 
			
		||||
func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
			
		||||
		return errNotExtendable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rv := reflect.ValueOf(v)
 | 
			
		||||
	if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) {
 | 
			
		||||
		return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType)
 | 
			
		||||
	}
 | 
			
		||||
	if rv.Kind() == reflect.Ptr {
 | 
			
		||||
		if rv.IsNil() {
 | 
			
		||||
			return fmt.Errorf("proto: SetExtension called with nil value of type %T", v)
 | 
			
		||||
		}
 | 
			
		||||
		if isScalarKind(rv.Elem().Kind()) {
 | 
			
		||||
			v = rv.Elem().Interface()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return v
 | 
			
		||||
 | 
			
		||||
	xtd := xt.TypeDescriptor()
 | 
			
		||||
	if !isValidExtension(mr.Descriptor(), xtd) {
 | 
			
		||||
		return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m)
 | 
			
		||||
	}
 | 
			
		||||
	mr.Set(xtd, xt.ValueOf(v))
 | 
			
		||||
	clearUnknown(mr, fieldNum(xt.Field))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetRawExtension inserts b into the unknown fields of m.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use Message.ProtoReflect.SetUnknown instead.
 | 
			
		||||
func SetRawExtension(m Message, fnum int32, b []byte) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Verify that the raw field is valid.
 | 
			
		||||
	for b0 := b; len(b0) > 0; {
 | 
			
		||||
		num, _, n := protowire.ConsumeField(b0)
 | 
			
		||||
		if int32(num) != fnum {
 | 
			
		||||
			panic(fmt.Sprintf("mismatching field number: got %d, want %d", num, fnum))
 | 
			
		||||
		}
 | 
			
		||||
		b0 = b0[n:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ClearExtension(m, &ExtensionDesc{Field: fnum})
 | 
			
		||||
	mr.SetUnknown(append(mr.GetUnknown(), b...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExtensionDescs returns a list of extension descriptors found in m,
 | 
			
		||||
// containing descriptors for both populated extension fields in m and
 | 
			
		||||
// also unknown fields of m that are in the extension range.
 | 
			
		||||
// For the later case, an type incomplete descriptor is provided where only
 | 
			
		||||
// the ExtensionDesc.Field field is populated.
 | 
			
		||||
// The order of the extension descriptors is undefined.
 | 
			
		||||
func ExtensionDescs(m Message) ([]*ExtensionDesc, error) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
			
		||||
		return nil, errNotExtendable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Collect a set of known extension descriptors.
 | 
			
		||||
	extDescs := make(map[protoreflect.FieldNumber]*ExtensionDesc)
 | 
			
		||||
	mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
			
		||||
		if fd.IsExtension() {
 | 
			
		||||
			xt := fd.(protoreflect.ExtensionTypeDescriptor)
 | 
			
		||||
			if xd, ok := xt.Type().(*ExtensionDesc); ok {
 | 
			
		||||
				extDescs[fd.Number()] = xd
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Collect a set of unknown extension descriptors.
 | 
			
		||||
	extRanges := mr.Descriptor().ExtensionRanges()
 | 
			
		||||
	for b := mr.GetUnknown(); len(b) > 0; {
 | 
			
		||||
		num, _, n := protowire.ConsumeField(b)
 | 
			
		||||
		if extRanges.Has(num) && extDescs[num] == nil {
 | 
			
		||||
			extDescs[num] = nil
 | 
			
		||||
		}
 | 
			
		||||
		b = b[n:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Transpose the set of descriptors into a list.
 | 
			
		||||
	var xts []*ExtensionDesc
 | 
			
		||||
	for num, xt := range extDescs {
 | 
			
		||||
		if xt == nil {
 | 
			
		||||
			xt = &ExtensionDesc{Field: int32(num)}
 | 
			
		||||
		}
 | 
			
		||||
		xts = append(xts, xt)
 | 
			
		||||
	}
 | 
			
		||||
	return xts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isValidExtension reports whether xtd is a valid extension descriptor for md.
 | 
			
		||||
func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflect.ExtensionTypeDescriptor) bool {
 | 
			
		||||
	return xtd.ContainingMessage() == md && md.ExtensionRanges().Has(xtd.Number())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isScalarKind reports whether k is a protobuf scalar kind (except bytes).
 | 
			
		||||
// This function exists for historical reasons since the representation of
 | 
			
		||||
// scalars differs between v1 and v2, where v1 uses *T and v2 uses T.
 | 
			
		||||
func isScalarKind(k reflect.Kind) bool {
 | 
			
		||||
	switch k {
 | 
			
		||||
	case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
 | 
			
		||||
		return true
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// clearUnknown removes unknown fields from m where remover.Has reports true.
 | 
			
		||||
func clearUnknown(m protoreflect.Message, remover interface {
 | 
			
		||||
	Has(protoreflect.FieldNumber) bool
 | 
			
		||||
}) {
 | 
			
		||||
	var bo protoreflect.RawFields
 | 
			
		||||
	for bi := m.GetUnknown(); len(bi) > 0; {
 | 
			
		||||
		num, _, n := protowire.ConsumeField(bi)
 | 
			
		||||
		if !remover.Has(num) {
 | 
			
		||||
			bo = append(bo, bi[:n]...)
 | 
			
		||||
		}
 | 
			
		||||
		bi = bi[n:]
 | 
			
		||||
	}
 | 
			
		||||
	if bi := m.GetUnknown(); len(bi) != len(bo) {
 | 
			
		||||
		m.SetUnknown(bo)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type fieldNum protoreflect.FieldNumber
 | 
			
		||||
 | 
			
		||||
func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool {
 | 
			
		||||
	return protoreflect.FieldNumber(n1) == n2
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										965
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										965
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,965 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Package proto converts data structures to and from the wire format of
 | 
			
		||||
protocol buffers.  It works in concert with the Go source code generated
 | 
			
		||||
for .proto files by the protocol compiler.
 | 
			
		||||
 | 
			
		||||
A summary of the properties of the protocol buffer interface
 | 
			
		||||
for a protocol buffer variable v:
 | 
			
		||||
 | 
			
		||||
  - Names are turned from camel_case to CamelCase for export.
 | 
			
		||||
  - There are no methods on v to set fields; just treat
 | 
			
		||||
	them as structure fields.
 | 
			
		||||
  - There are getters that return a field's value if set,
 | 
			
		||||
	and return the field's default value if unset.
 | 
			
		||||
	The getters work even if the receiver is a nil message.
 | 
			
		||||
  - The zero value for a struct is its correct initialization state.
 | 
			
		||||
	All desired fields must be set before marshaling.
 | 
			
		||||
  - A Reset() method will restore a protobuf struct to its zero state.
 | 
			
		||||
  - Non-repeated fields are pointers to the values; nil means unset.
 | 
			
		||||
	That is, optional or required field int32 f becomes F *int32.
 | 
			
		||||
  - Repeated fields are slices.
 | 
			
		||||
  - Helper functions are available to aid the setting of fields.
 | 
			
		||||
	msg.Foo = proto.String("hello") // set field
 | 
			
		||||
  - Constants are defined to hold the default values of all fields that
 | 
			
		||||
	have them.  They have the form Default_StructName_FieldName.
 | 
			
		||||
	Because the getter methods handle defaulted values,
 | 
			
		||||
	direct use of these constants should be rare.
 | 
			
		||||
  - Enums are given type names and maps from names to values.
 | 
			
		||||
	Enum values are prefixed by the enclosing message's name, or by the
 | 
			
		||||
	enum's type name if it is a top-level enum. Enum types have a String
 | 
			
		||||
	method, and a Enum method to assist in message construction.
 | 
			
		||||
  - Nested messages, groups and enums have type names prefixed with the name of
 | 
			
		||||
	the surrounding message type.
 | 
			
		||||
  - Extensions are given descriptor names that start with E_,
 | 
			
		||||
	followed by an underscore-delimited list of the nested messages
 | 
			
		||||
	that contain it (if any) followed by the CamelCased name of the
 | 
			
		||||
	extension field itself.  HasExtension, ClearExtension, GetExtension
 | 
			
		||||
	and SetExtension are functions for manipulating extensions.
 | 
			
		||||
  - Oneof field sets are given a single field in their message,
 | 
			
		||||
	with distinguished wrapper types for each possible field value.
 | 
			
		||||
  - Marshal and Unmarshal are functions to encode and decode the wire format.
 | 
			
		||||
 | 
			
		||||
When the .proto file specifies `syntax="proto3"`, there are some differences:
 | 
			
		||||
 | 
			
		||||
  - Non-repeated fields of non-message type are values instead of pointers.
 | 
			
		||||
  - Enum types do not get an Enum method.
 | 
			
		||||
 | 
			
		||||
The simplest way to describe this is to see an example.
 | 
			
		||||
Given file test.proto, containing
 | 
			
		||||
 | 
			
		||||
	package example;
 | 
			
		||||
 | 
			
		||||
	enum FOO { X = 17; }
 | 
			
		||||
 | 
			
		||||
	message Test {
 | 
			
		||||
	  required string label = 1;
 | 
			
		||||
	  optional int32 type = 2 [default=77];
 | 
			
		||||
	  repeated int64 reps = 3;
 | 
			
		||||
	  optional group OptionalGroup = 4 {
 | 
			
		||||
	    required string RequiredField = 5;
 | 
			
		||||
	  }
 | 
			
		||||
	  oneof union {
 | 
			
		||||
	    int32 number = 6;
 | 
			
		||||
	    string name = 7;
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
The resulting file, test.pb.go, is:
 | 
			
		||||
 | 
			
		||||
	package example
 | 
			
		||||
 | 
			
		||||
	import proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	import math "math"
 | 
			
		||||
 | 
			
		||||
	type FOO int32
 | 
			
		||||
	const (
 | 
			
		||||
		FOO_X FOO = 17
 | 
			
		||||
	)
 | 
			
		||||
	var FOO_name = map[int32]string{
 | 
			
		||||
		17: "X",
 | 
			
		||||
	}
 | 
			
		||||
	var FOO_value = map[string]int32{
 | 
			
		||||
		"X": 17,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (x FOO) Enum() *FOO {
 | 
			
		||||
		p := new(FOO)
 | 
			
		||||
		*p = x
 | 
			
		||||
		return p
 | 
			
		||||
	}
 | 
			
		||||
	func (x FOO) String() string {
 | 
			
		||||
		return proto.EnumName(FOO_name, int32(x))
 | 
			
		||||
	}
 | 
			
		||||
	func (x *FOO) UnmarshalJSON(data []byte) error {
 | 
			
		||||
		value, err := proto.UnmarshalJSONEnum(FOO_value, data)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		*x = FOO(value)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type Test struct {
 | 
			
		||||
		Label         *string             `protobuf:"bytes,1,req,name=label" json:"label,omitempty"`
 | 
			
		||||
		Type          *int32              `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"`
 | 
			
		||||
		Reps          []int64             `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"`
 | 
			
		||||
		Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"`
 | 
			
		||||
		// Types that are valid to be assigned to Union:
 | 
			
		||||
		//	*Test_Number
 | 
			
		||||
		//	*Test_Name
 | 
			
		||||
		Union            isTest_Union `protobuf_oneof:"union"`
 | 
			
		||||
		XXX_unrecognized []byte       `json:"-"`
 | 
			
		||||
	}
 | 
			
		||||
	func (m *Test) Reset()         { *m = Test{} }
 | 
			
		||||
	func (m *Test) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
	func (*Test) ProtoMessage() {}
 | 
			
		||||
 | 
			
		||||
	type isTest_Union interface {
 | 
			
		||||
		isTest_Union()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type Test_Number struct {
 | 
			
		||||
		Number int32 `protobuf:"varint,6,opt,name=number"`
 | 
			
		||||
	}
 | 
			
		||||
	type Test_Name struct {
 | 
			
		||||
		Name string `protobuf:"bytes,7,opt,name=name"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (*Test_Number) isTest_Union() {}
 | 
			
		||||
	func (*Test_Name) isTest_Union()   {}
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetUnion() isTest_Union {
 | 
			
		||||
		if m != nil {
 | 
			
		||||
			return m.Union
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	const Default_Test_Type int32 = 77
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetLabel() string {
 | 
			
		||||
		if m != nil && m.Label != nil {
 | 
			
		||||
			return *m.Label
 | 
			
		||||
		}
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetType() int32 {
 | 
			
		||||
		if m != nil && m.Type != nil {
 | 
			
		||||
			return *m.Type
 | 
			
		||||
		}
 | 
			
		||||
		return Default_Test_Type
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetOptionalgroup() *Test_OptionalGroup {
 | 
			
		||||
		if m != nil {
 | 
			
		||||
			return m.Optionalgroup
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type Test_OptionalGroup struct {
 | 
			
		||||
		RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"`
 | 
			
		||||
	}
 | 
			
		||||
	func (m *Test_OptionalGroup) Reset()         { *m = Test_OptionalGroup{} }
 | 
			
		||||
	func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
 | 
			
		||||
	func (m *Test_OptionalGroup) GetRequiredField() string {
 | 
			
		||||
		if m != nil && m.RequiredField != nil {
 | 
			
		||||
			return *m.RequiredField
 | 
			
		||||
		}
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetNumber() int32 {
 | 
			
		||||
		if x, ok := m.GetUnion().(*Test_Number); ok {
 | 
			
		||||
			return x.Number
 | 
			
		||||
		}
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func (m *Test) GetName() string {
 | 
			
		||||
		if x, ok := m.GetUnion().(*Test_Name); ok {
 | 
			
		||||
			return x.Name
 | 
			
		||||
		}
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func init() {
 | 
			
		||||
		proto.RegisterEnum("example.FOO", FOO_name, FOO_value)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
To create and play with a Test object:
 | 
			
		||||
 | 
			
		||||
	package main
 | 
			
		||||
 | 
			
		||||
	import (
 | 
			
		||||
		"log"
 | 
			
		||||
 | 
			
		||||
		"github.com/golang/protobuf/proto"
 | 
			
		||||
		pb "./example.pb"
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	func main() {
 | 
			
		||||
		test := &pb.Test{
 | 
			
		||||
			Label: proto.String("hello"),
 | 
			
		||||
			Type:  proto.Int32(17),
 | 
			
		||||
			Reps:  []int64{1, 2, 3},
 | 
			
		||||
			Optionalgroup: &pb.Test_OptionalGroup{
 | 
			
		||||
				RequiredField: proto.String("good bye"),
 | 
			
		||||
			},
 | 
			
		||||
			Union: &pb.Test_Name{"fred"},
 | 
			
		||||
		}
 | 
			
		||||
		data, err := proto.Marshal(test)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatal("marshaling error: ", err)
 | 
			
		||||
		}
 | 
			
		||||
		newTest := &pb.Test{}
 | 
			
		||||
		err = proto.Unmarshal(data, newTest)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatal("unmarshaling error: ", err)
 | 
			
		||||
		}
 | 
			
		||||
		// Now test and newTest contain the same data.
 | 
			
		||||
		if test.GetLabel() != newTest.GetLabel() {
 | 
			
		||||
			log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
 | 
			
		||||
		}
 | 
			
		||||
		// Use a type switch to determine which oneof was set.
 | 
			
		||||
		switch u := test.Union.(type) {
 | 
			
		||||
		case *pb.Test_Number: // u.Number contains the number.
 | 
			
		||||
		case *pb.Test_Name: // u.Name contains the string.
 | 
			
		||||
		}
 | 
			
		||||
		// etc.
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RequiredNotSetError is an error type returned by either Marshal or Unmarshal.
 | 
			
		||||
// Marshal reports this when a required field is not initialized.
 | 
			
		||||
// Unmarshal reports this when a required field is missing from the wire data.
 | 
			
		||||
type RequiredNotSetError struct{ field string }
 | 
			
		||||
 | 
			
		||||
func (e *RequiredNotSetError) Error() string {
 | 
			
		||||
	if e.field == "" {
 | 
			
		||||
		return fmt.Sprintf("proto: required field not set")
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("proto: required field %q not set", e.field)
 | 
			
		||||
}
 | 
			
		||||
func (e *RequiredNotSetError) RequiredNotSet() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type invalidUTF8Error struct{ field string }
 | 
			
		||||
 | 
			
		||||
func (e *invalidUTF8Error) Error() string {
 | 
			
		||||
	if e.field == "" {
 | 
			
		||||
		return "proto: invalid UTF-8 detected"
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field)
 | 
			
		||||
}
 | 
			
		||||
func (e *invalidUTF8Error) InvalidUTF8() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8.
 | 
			
		||||
// This error should not be exposed to the external API as such errors should
 | 
			
		||||
// be recreated with the field information.
 | 
			
		||||
var errInvalidUTF8 = &invalidUTF8Error{}
 | 
			
		||||
 | 
			
		||||
// isNonFatal reports whether the error is either a RequiredNotSet error
 | 
			
		||||
// or a InvalidUTF8 error.
 | 
			
		||||
func isNonFatal(err error) bool {
 | 
			
		||||
	if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() {
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type nonFatal struct{ E error }
 | 
			
		||||
 | 
			
		||||
// Merge merges err into nf and reports whether it was successful.
 | 
			
		||||
// Otherwise it returns false for any fatal non-nil errors.
 | 
			
		||||
func (nf *nonFatal) Merge(err error) (ok bool) {
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return true // not an error
 | 
			
		||||
	}
 | 
			
		||||
	if !isNonFatal(err) {
 | 
			
		||||
		return false // fatal error
 | 
			
		||||
	}
 | 
			
		||||
	if nf.E == nil {
 | 
			
		||||
		nf.E = err // store first instance of non-fatal error
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Message is implemented by generated protocol buffer messages.
 | 
			
		||||
type Message interface {
 | 
			
		||||
	Reset()
 | 
			
		||||
	String() string
 | 
			
		||||
	ProtoMessage()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Buffer is a buffer manager for marshaling and unmarshaling
 | 
			
		||||
// protocol buffers.  It may be reused between invocations to
 | 
			
		||||
// reduce memory usage.  It is not necessary to use a Buffer;
 | 
			
		||||
// the global functions Marshal and Unmarshal create a
 | 
			
		||||
// temporary Buffer and are fine for most applications.
 | 
			
		||||
type Buffer struct {
 | 
			
		||||
	buf   []byte // encode/decode byte stream
 | 
			
		||||
	index int    // read point
 | 
			
		||||
 | 
			
		||||
	deterministic bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewBuffer allocates a new Buffer and initializes its internal data to
 | 
			
		||||
// the contents of the argument slice.
 | 
			
		||||
func NewBuffer(e []byte) *Buffer {
 | 
			
		||||
	return &Buffer{buf: e}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reset resets the Buffer, ready for marshaling a new protocol buffer.
 | 
			
		||||
func (p *Buffer) Reset() {
 | 
			
		||||
	p.buf = p.buf[0:0] // for reading/writing
 | 
			
		||||
	p.index = 0        // for reading
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetBuf replaces the internal buffer with the slice,
 | 
			
		||||
// ready for unmarshaling the contents of the slice.
 | 
			
		||||
func (p *Buffer) SetBuf(s []byte) {
 | 
			
		||||
	p.buf = s
 | 
			
		||||
	p.index = 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bytes returns the contents of the Buffer.
 | 
			
		||||
func (p *Buffer) Bytes() []byte { return p.buf }
 | 
			
		||||
 | 
			
		||||
// SetDeterministic sets whether to use deterministic serialization.
 | 
			
		||||
//
 | 
			
		||||
// Deterministic serialization guarantees that for a given binary, equal
 | 
			
		||||
// messages will always be serialized to the same bytes. This implies:
 | 
			
		||||
//
 | 
			
		||||
//   - Repeated serialization of a message will return the same bytes.
 | 
			
		||||
//   - Different processes of the same binary (which may be executing on
 | 
			
		||||
//     different machines) will serialize equal messages to the same bytes.
 | 
			
		||||
//
 | 
			
		||||
// Note that the deterministic serialization is NOT canonical across
 | 
			
		||||
// languages. It is not guaranteed to remain stable over time. It is unstable
 | 
			
		||||
// across different builds with schema changes due to unknown fields.
 | 
			
		||||
// Users who need canonical serialization (e.g., persistent storage in a
 | 
			
		||||
// canonical form, fingerprinting, etc.) should define their own
 | 
			
		||||
// canonicalization specification and implement their own serializer rather
 | 
			
		||||
// than relying on this API.
 | 
			
		||||
//
 | 
			
		||||
// If deterministic serialization is requested, map entries will be sorted
 | 
			
		||||
// by keys in lexicographical order. This is an implementation detail and
 | 
			
		||||
// subject to change.
 | 
			
		||||
func (p *Buffer) SetDeterministic(deterministic bool) {
 | 
			
		||||
	p.deterministic = deterministic
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Helper routines for simplifying the creation of optional fields of basic type.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Bool is a helper routine that allocates a new bool value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Bool(v bool) *bool {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int32 is a helper routine that allocates a new int32 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Int32(v int32) *int32 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int is a helper routine that allocates a new int32 value
 | 
			
		||||
// to store v and returns a pointer to it, but unlike Int32
 | 
			
		||||
// its argument value is an int.
 | 
			
		||||
func Int(v int) *int32 {
 | 
			
		||||
	p := new(int32)
 | 
			
		||||
	*p = int32(v)
 | 
			
		||||
	return p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Int64 is a helper routine that allocates a new int64 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Int64(v int64) *int64 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float32 is a helper routine that allocates a new float32 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Float32(v float32) *float32 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Float64 is a helper routine that allocates a new float64 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Float64(v float64) *float64 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Uint32 is a helper routine that allocates a new uint32 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Uint32(v uint32) *uint32 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Uint64 is a helper routine that allocates a new uint64 value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func Uint64(v uint64) *uint64 {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String is a helper routine that allocates a new string value
 | 
			
		||||
// to store v and returns a pointer to it.
 | 
			
		||||
func String(v string) *string {
 | 
			
		||||
	return &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnumName is a helper function to simplify printing protocol buffer enums
 | 
			
		||||
// by name.  Given an enum map and a value, it returns a useful string.
 | 
			
		||||
func EnumName(m map[int32]string, v int32) string {
 | 
			
		||||
	s, ok := m[v]
 | 
			
		||||
	if ok {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
	return strconv.Itoa(int(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalJSONEnum is a helper function to simplify recovering enum int values
 | 
			
		||||
// from their JSON-encoded representation. Given a map from the enum's symbolic
 | 
			
		||||
// names to its int values, and a byte buffer containing the JSON-encoded
 | 
			
		||||
// value, it returns an int32 that can be cast to the enum type by the caller.
 | 
			
		||||
//
 | 
			
		||||
// The function can deal with both JSON representations, numeric and symbolic.
 | 
			
		||||
func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) {
 | 
			
		||||
	if data[0] == '"' {
 | 
			
		||||
		// New style: enums are strings.
 | 
			
		||||
		var repr string
 | 
			
		||||
		if err := json.Unmarshal(data, &repr); err != nil {
 | 
			
		||||
			return -1, err
 | 
			
		||||
		}
 | 
			
		||||
		val, ok := m[repr]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr)
 | 
			
		||||
		}
 | 
			
		||||
		return val, nil
 | 
			
		||||
	}
 | 
			
		||||
	// Old style: enums are ints.
 | 
			
		||||
	var val int32
 | 
			
		||||
	if err := json.Unmarshal(data, &val); err != nil {
 | 
			
		||||
		return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName)
 | 
			
		||||
	}
 | 
			
		||||
	return val, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DebugPrint dumps the encoded data in b in a debugging format with a header
 | 
			
		||||
// including the string s. Used in testing but made available for general debugging.
 | 
			
		||||
func (p *Buffer) DebugPrint(s string, b []byte) {
 | 
			
		||||
	var u uint64
 | 
			
		||||
 | 
			
		||||
	obuf := p.buf
 | 
			
		||||
	index := p.index
 | 
			
		||||
	p.buf = b
 | 
			
		||||
	p.index = 0
 | 
			
		||||
	depth := 0
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("\n--- %s ---\n", s)
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	for {
 | 
			
		||||
		for i := 0; i < depth; i++ {
 | 
			
		||||
			fmt.Print("  ")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		index := p.index
 | 
			
		||||
		if index == len(p.buf) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		op, err := p.DecodeVarint()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Printf("%3d: fetching op err %v\n", index, err)
 | 
			
		||||
			break out
 | 
			
		||||
		}
 | 
			
		||||
		tag := op >> 3
 | 
			
		||||
		wire := op & 7
 | 
			
		||||
 | 
			
		||||
		switch wire {
 | 
			
		||||
		default:
 | 
			
		||||
			fmt.Printf("%3d: t=%3d unknown wire=%d\n",
 | 
			
		||||
				index, tag, wire)
 | 
			
		||||
			break out
 | 
			
		||||
 | 
			
		||||
		case WireBytes:
 | 
			
		||||
			var r []byte
 | 
			
		||||
 | 
			
		||||
			r, err = p.DecodeRawBytes(false)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				break out
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r))
 | 
			
		||||
			if len(r) <= 6 {
 | 
			
		||||
				for i := 0; i < len(r); i++ {
 | 
			
		||||
					fmt.Printf(" %.2x", r[i])
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				for i := 0; i < 3; i++ {
 | 
			
		||||
					fmt.Printf(" %.2x", r[i])
 | 
			
		||||
				}
 | 
			
		||||
				fmt.Printf(" ..")
 | 
			
		||||
				for i := len(r) - 3; i < len(r); i++ {
 | 
			
		||||
					fmt.Printf(" %.2x", r[i])
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Printf("\n")
 | 
			
		||||
 | 
			
		||||
		case WireFixed32:
 | 
			
		||||
			u, err = p.DecodeFixed32()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err)
 | 
			
		||||
				break out
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u)
 | 
			
		||||
 | 
			
		||||
		case WireFixed64:
 | 
			
		||||
			u, err = p.DecodeFixed64()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err)
 | 
			
		||||
				break out
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u)
 | 
			
		||||
 | 
			
		||||
		case WireVarint:
 | 
			
		||||
			u, err = p.DecodeVarint()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err)
 | 
			
		||||
				break out
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u)
 | 
			
		||||
 | 
			
		||||
		case WireStartGroup:
 | 
			
		||||
			fmt.Printf("%3d: t=%3d start\n", index, tag)
 | 
			
		||||
			depth++
 | 
			
		||||
 | 
			
		||||
		case WireEndGroup:
 | 
			
		||||
			depth--
 | 
			
		||||
			fmt.Printf("%3d: t=%3d end\n", index, tag)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if depth != 0 {
 | 
			
		||||
		fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Printf("\n")
 | 
			
		||||
 | 
			
		||||
	p.buf = obuf
 | 
			
		||||
	p.index = index
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetDefaults sets unset protocol buffer fields to their default values.
 | 
			
		||||
// It only modifies fields that are both unset and have defined defaults.
 | 
			
		||||
// It recursively sets default values in any non-nil sub-messages.
 | 
			
		||||
func SetDefaults(pb Message) {
 | 
			
		||||
	setDefaults(reflect.ValueOf(pb), true, false)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// v is a pointer to a struct.
 | 
			
		||||
func setDefaults(v reflect.Value, recur, zeros bool) {
 | 
			
		||||
	v = v.Elem()
 | 
			
		||||
 | 
			
		||||
	defaultMu.RLock()
 | 
			
		||||
	dm, ok := defaults[v.Type()]
 | 
			
		||||
	defaultMu.RUnlock()
 | 
			
		||||
	if !ok {
 | 
			
		||||
		dm = buildDefaultMessage(v.Type())
 | 
			
		||||
		defaultMu.Lock()
 | 
			
		||||
		defaults[v.Type()] = dm
 | 
			
		||||
		defaultMu.Unlock()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, sf := range dm.scalars {
 | 
			
		||||
		f := v.Field(sf.index)
 | 
			
		||||
		if !f.IsNil() {
 | 
			
		||||
			// field already set
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		dv := sf.value
 | 
			
		||||
		if dv == nil && !zeros {
 | 
			
		||||
			// no explicit default, and don't want to set zeros
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		fptr := f.Addr().Interface() // **T
 | 
			
		||||
		// TODO: Consider batching the allocations we do here.
 | 
			
		||||
		switch sf.kind {
 | 
			
		||||
		case reflect.Bool:
 | 
			
		||||
			b := new(bool)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*b = dv.(bool)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**bool)) = b
 | 
			
		||||
		case reflect.Float32:
 | 
			
		||||
			f := new(float32)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*f = dv.(float32)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**float32)) = f
 | 
			
		||||
		case reflect.Float64:
 | 
			
		||||
			f := new(float64)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*f = dv.(float64)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**float64)) = f
 | 
			
		||||
		case reflect.Int32:
 | 
			
		||||
			// might be an enum
 | 
			
		||||
			if ft := f.Type(); ft != int32PtrType {
 | 
			
		||||
				// enum
 | 
			
		||||
				f.Set(reflect.New(ft.Elem()))
 | 
			
		||||
				if dv != nil {
 | 
			
		||||
					f.Elem().SetInt(int64(dv.(int32)))
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				// int32 field
 | 
			
		||||
				i := new(int32)
 | 
			
		||||
				if dv != nil {
 | 
			
		||||
					*i = dv.(int32)
 | 
			
		||||
				}
 | 
			
		||||
				*(fptr.(**int32)) = i
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Int64:
 | 
			
		||||
			i := new(int64)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*i = dv.(int64)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**int64)) = i
 | 
			
		||||
		case reflect.String:
 | 
			
		||||
			s := new(string)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*s = dv.(string)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**string)) = s
 | 
			
		||||
		case reflect.Uint8:
 | 
			
		||||
			// exceptional case: []byte
 | 
			
		||||
			var b []byte
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				db := dv.([]byte)
 | 
			
		||||
				b = make([]byte, len(db))
 | 
			
		||||
				copy(b, db)
 | 
			
		||||
			} else {
 | 
			
		||||
				b = []byte{}
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(*[]byte)) = b
 | 
			
		||||
		case reflect.Uint32:
 | 
			
		||||
			u := new(uint32)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*u = dv.(uint32)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**uint32)) = u
 | 
			
		||||
		case reflect.Uint64:
 | 
			
		||||
			u := new(uint64)
 | 
			
		||||
			if dv != nil {
 | 
			
		||||
				*u = dv.(uint64)
 | 
			
		||||
			}
 | 
			
		||||
			*(fptr.(**uint64)) = u
 | 
			
		||||
		default:
 | 
			
		||||
			log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, ni := range dm.nested {
 | 
			
		||||
		f := v.Field(ni)
 | 
			
		||||
		// f is *T or []*T or map[T]*T
 | 
			
		||||
		switch f.Kind() {
 | 
			
		||||
		case reflect.Ptr:
 | 
			
		||||
			if f.IsNil() {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			setDefaults(f, recur, zeros)
 | 
			
		||||
 | 
			
		||||
		case reflect.Slice:
 | 
			
		||||
			for i := 0; i < f.Len(); i++ {
 | 
			
		||||
				e := f.Index(i)
 | 
			
		||||
				if e.IsNil() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				setDefaults(e, recur, zeros)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		case reflect.Map:
 | 
			
		||||
			for _, k := range f.MapKeys() {
 | 
			
		||||
				e := f.MapIndex(k)
 | 
			
		||||
				if e.IsNil() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				setDefaults(e, recur, zeros)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// defaults maps a protocol buffer struct type to a slice of the fields,
 | 
			
		||||
	// with its scalar fields set to their proto-declared non-zero default values.
 | 
			
		||||
	defaultMu sync.RWMutex
 | 
			
		||||
	defaults  = make(map[reflect.Type]defaultMessage)
 | 
			
		||||
 | 
			
		||||
	int32PtrType = reflect.TypeOf((*int32)(nil))
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// defaultMessage represents information about the default values of a message.
 | 
			
		||||
type defaultMessage struct {
 | 
			
		||||
	scalars []scalarField
 | 
			
		||||
	nested  []int // struct field index of nested messages
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type scalarField struct {
 | 
			
		||||
	index int          // struct field index
 | 
			
		||||
	kind  reflect.Kind // element type (the T in *T or []T)
 | 
			
		||||
	value interface{}  // the proto-declared default value, or nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// t is a struct type.
 | 
			
		||||
func buildDefaultMessage(t reflect.Type) (dm defaultMessage) {
 | 
			
		||||
	sprop := GetProperties(t)
 | 
			
		||||
	for _, prop := range sprop.Prop {
 | 
			
		||||
		fi, ok := sprop.decoderTags.get(prop.Tag)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			// XXX_unrecognized
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		ft := t.Field(fi).Type
 | 
			
		||||
 | 
			
		||||
		sf, nested, err := fieldDefault(ft, prop)
 | 
			
		||||
		switch {
 | 
			
		||||
		case err != nil:
 | 
			
		||||
			log.Print(err)
 | 
			
		||||
		case nested:
 | 
			
		||||
			dm.nested = append(dm.nested, fi)
 | 
			
		||||
		case sf != nil:
 | 
			
		||||
			sf.index = fi
 | 
			
		||||
			dm.scalars = append(dm.scalars, *sf)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dm
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// fieldDefault returns the scalarField for field type ft.
 | 
			
		||||
// sf will be nil if the field can not have a default.
 | 
			
		||||
// nestedMessage will be true if this is a nested message.
 | 
			
		||||
// Note that sf.index is not set on return.
 | 
			
		||||
func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) {
 | 
			
		||||
	var canHaveDefault bool
 | 
			
		||||
	switch ft.Kind() {
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		if ft.Elem().Kind() == reflect.Struct {
 | 
			
		||||
			nestedMessage = true
 | 
			
		||||
		} else {
 | 
			
		||||
			canHaveDefault = true // proto2 scalar field
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		switch ft.Elem().Kind() {
 | 
			
		||||
		case reflect.Ptr:
 | 
			
		||||
			nestedMessage = true // repeated message
 | 
			
		||||
		case reflect.Uint8:
 | 
			
		||||
			canHaveDefault = true // bytes field
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		if ft.Elem().Kind() == reflect.Ptr {
 | 
			
		||||
			nestedMessage = true // map with message values
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !canHaveDefault {
 | 
			
		||||
		if nestedMessage {
 | 
			
		||||
			return nil, true, nil
 | 
			
		||||
		}
 | 
			
		||||
		return nil, false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We now know that ft is a pointer or slice.
 | 
			
		||||
	sf = &scalarField{kind: ft.Elem().Kind()}
 | 
			
		||||
 | 
			
		||||
	// scalar fields without defaults
 | 
			
		||||
	if !prop.HasDefault {
 | 
			
		||||
		return sf, false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// a scalar field: either *T or []byte
 | 
			
		||||
	switch ft.Elem().Kind() {
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		x, err := strconv.ParseBool(prop.Default)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = x
 | 
			
		||||
	case reflect.Float32:
 | 
			
		||||
		x, err := strconv.ParseFloat(prop.Default, 32)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = float32(x)
 | 
			
		||||
	case reflect.Float64:
 | 
			
		||||
		x, err := strconv.ParseFloat(prop.Default, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = x
 | 
			
		||||
	case reflect.Int32:
 | 
			
		||||
		x, err := strconv.ParseInt(prop.Default, 10, 32)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = int32(x)
 | 
			
		||||
	case reflect.Int64:
 | 
			
		||||
		x, err := strconv.ParseInt(prop.Default, 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = x
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		sf.value = prop.Default
 | 
			
		||||
	case reflect.Uint8:
 | 
			
		||||
		// []byte (not *uint8)
 | 
			
		||||
		sf.value = []byte(prop.Default)
 | 
			
		||||
	case reflect.Uint32:
 | 
			
		||||
		x, err := strconv.ParseUint(prop.Default, 10, 32)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = uint32(x)
 | 
			
		||||
	case reflect.Uint64:
 | 
			
		||||
		x, err := strconv.ParseUint(prop.Default, 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err)
 | 
			
		||||
		}
 | 
			
		||||
		sf.value = x
 | 
			
		||||
	default:
 | 
			
		||||
		return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sf, false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mapKeys returns a sort.Interface to be used for sorting the map keys.
 | 
			
		||||
// Map fields may have key types of non-float scalars, strings and enums.
 | 
			
		||||
func mapKeys(vs []reflect.Value) sort.Interface {
 | 
			
		||||
	s := mapKeySorter{vs: vs}
 | 
			
		||||
 | 
			
		||||
	// Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps.
 | 
			
		||||
	if len(vs) == 0 {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
	switch vs[0].Kind() {
 | 
			
		||||
	case reflect.Int32, reflect.Int64:
 | 
			
		||||
		s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() }
 | 
			
		||||
	case reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() }
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		s.less = func(a, b reflect.Value) bool { return a.String() < b.String() }
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind()))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type mapKeySorter struct {
 | 
			
		||||
	vs   []reflect.Value
 | 
			
		||||
	less func(a, b reflect.Value) bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s mapKeySorter) Len() int      { return len(s.vs) }
 | 
			
		||||
func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] }
 | 
			
		||||
func (s mapKeySorter) Less(i, j int) bool {
 | 
			
		||||
	return s.less(s.vs[i], s.vs[j])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isProto3Zero reports whether v is a zero proto3 value.
 | 
			
		||||
func isProto3Zero(v reflect.Value) bool {
 | 
			
		||||
	switch v.Kind() {
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		return !v.Bool()
 | 
			
		||||
	case reflect.Int32, reflect.Int64:
 | 
			
		||||
		return v.Int() == 0
 | 
			
		||||
	case reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		return v.Uint() == 0
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		return v.Float() == 0
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		return v.String() == ""
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// ProtoPackageIsVersion3 is referenced from generated protocol buffer files
 | 
			
		||||
	// to assert that that code is compatible with this version of the proto package.
 | 
			
		||||
	ProtoPackageIsVersion3 = true
 | 
			
		||||
 | 
			
		||||
	// ProtoPackageIsVersion2 is referenced from generated protocol buffer files
 | 
			
		||||
	// to assert that that code is compatible with this version of the proto package.
 | 
			
		||||
	ProtoPackageIsVersion2 = true
 | 
			
		||||
 | 
			
		||||
	// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
 | 
			
		||||
	// to assert that that code is compatible with this version of the proto package.
 | 
			
		||||
	ProtoPackageIsVersion1 = true
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// InternalMessageInfo is a type used internally by generated .pb.go files.
 | 
			
		||||
// This type is not intended to be used by non-generated code.
 | 
			
		||||
// This type is not subject to any compatibility guarantee.
 | 
			
		||||
type InternalMessageInfo struct {
 | 
			
		||||
	marshal   *marshalInfo
 | 
			
		||||
	unmarshal *unmarshalInfo
 | 
			
		||||
	merge     *mergeInfo
 | 
			
		||||
	discard   *discardInfo
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										181
									
								
								vendor/github.com/golang/protobuf/proto/message_set.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										181
									
								
								vendor/github.com/golang/protobuf/proto/message_set.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,181 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Support for message sets.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
 | 
			
		||||
// A message type ID is required for storing a protocol buffer in a message set.
 | 
			
		||||
var errNoMessageTypeID = errors.New("proto does not have a message type ID")
 | 
			
		||||
 | 
			
		||||
// The first two types (_MessageSet_Item and messageSet)
 | 
			
		||||
// model what the protocol compiler produces for the following protocol message:
 | 
			
		||||
//   message MessageSet {
 | 
			
		||||
//     repeated group Item = 1 {
 | 
			
		||||
//       required int32 type_id = 2;
 | 
			
		||||
//       required string message = 3;
 | 
			
		||||
//     };
 | 
			
		||||
//   }
 | 
			
		||||
// That is the MessageSet wire format. We can't use a proto to generate these
 | 
			
		||||
// because that would introduce a circular dependency between it and this package.
 | 
			
		||||
 | 
			
		||||
type _MessageSet_Item struct {
 | 
			
		||||
	TypeId  *int32 `protobuf:"varint,2,req,name=type_id"`
 | 
			
		||||
	Message []byte `protobuf:"bytes,3,req,name=message"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type messageSet struct {
 | 
			
		||||
	Item             []*_MessageSet_Item `protobuf:"group,1,rep"`
 | 
			
		||||
	XXX_unrecognized []byte
 | 
			
		||||
	// TODO: caching?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Make sure messageSet is a Message.
 | 
			
		||||
var _ Message = (*messageSet)(nil)
 | 
			
		||||
 | 
			
		||||
// messageTypeIder is an interface satisfied by a protocol buffer type
 | 
			
		||||
// that may be stored in a MessageSet.
 | 
			
		||||
type messageTypeIder interface {
 | 
			
		||||
	MessageTypeId() int32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ms *messageSet) find(pb Message) *_MessageSet_Item {
 | 
			
		||||
	mti, ok := pb.(messageTypeIder)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	id := mti.MessageTypeId()
 | 
			
		||||
	for _, item := range ms.Item {
 | 
			
		||||
		if *item.TypeId == id {
 | 
			
		||||
			return item
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ms *messageSet) Has(pb Message) bool {
 | 
			
		||||
	return ms.find(pb) != nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ms *messageSet) Unmarshal(pb Message) error {
 | 
			
		||||
	if item := ms.find(pb); item != nil {
 | 
			
		||||
		return Unmarshal(item.Message, pb)
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := pb.(messageTypeIder); !ok {
 | 
			
		||||
		return errNoMessageTypeID
 | 
			
		||||
	}
 | 
			
		||||
	return nil // TODO: return error instead?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ms *messageSet) Marshal(pb Message) error {
 | 
			
		||||
	msg, err := Marshal(pb)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if item := ms.find(pb); item != nil {
 | 
			
		||||
		// reuse existing item
 | 
			
		||||
		item.Message = msg
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mti, ok := pb.(messageTypeIder)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return errNoMessageTypeID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mtid := mti.MessageTypeId()
 | 
			
		||||
	ms.Item = append(ms.Item, &_MessageSet_Item{
 | 
			
		||||
		TypeId:  &mtid,
 | 
			
		||||
		Message: msg,
 | 
			
		||||
	})
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ms *messageSet) Reset()         { *ms = messageSet{} }
 | 
			
		||||
func (ms *messageSet) String() string { return CompactTextString(ms) }
 | 
			
		||||
func (*messageSet) ProtoMessage()     {}
 | 
			
		||||
 | 
			
		||||
// Support for the message_set_wire_format message option.
 | 
			
		||||
 | 
			
		||||
func skipVarint(buf []byte) []byte {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for ; buf[i]&0x80 != 0; i++ {
 | 
			
		||||
	}
 | 
			
		||||
	return buf[i+1:]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// unmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.
 | 
			
		||||
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
 | 
			
		||||
func unmarshalMessageSet(buf []byte, exts interface{}) error {
 | 
			
		||||
	var m map[int32]Extension
 | 
			
		||||
	switch exts := exts.(type) {
 | 
			
		||||
	case *XXX_InternalExtensions:
 | 
			
		||||
		m = exts.extensionsWrite()
 | 
			
		||||
	case map[int32]Extension:
 | 
			
		||||
		m = exts
 | 
			
		||||
	default:
 | 
			
		||||
		return errors.New("proto: not an extension map")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ms := new(messageSet)
 | 
			
		||||
	if err := Unmarshal(buf, ms); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, item := range ms.Item {
 | 
			
		||||
		id := *item.TypeId
 | 
			
		||||
		msg := item.Message
 | 
			
		||||
 | 
			
		||||
		// Restore wire type and field number varint, plus length varint.
 | 
			
		||||
		// Be careful to preserve duplicate items.
 | 
			
		||||
		b := EncodeVarint(uint64(id)<<3 | WireBytes)
 | 
			
		||||
		if ext, ok := m[id]; ok {
 | 
			
		||||
			// Existing data; rip off the tag and length varint
 | 
			
		||||
			// so we join the new data correctly.
 | 
			
		||||
			// We can assume that ext.enc is set because we are unmarshaling.
 | 
			
		||||
			o := ext.enc[len(b):]   // skip wire type and field number
 | 
			
		||||
			_, n := DecodeVarint(o) // calculate length of length varint
 | 
			
		||||
			o = o[n:]               // skip length varint
 | 
			
		||||
			msg = append(o, msg...) // join old data and new data
 | 
			
		||||
		}
 | 
			
		||||
		b = append(b, EncodeVarint(uint64(len(msg)))...)
 | 
			
		||||
		b = append(b, msg...)
 | 
			
		||||
 | 
			
		||||
		m[id] = Extension{enc: b}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										360
									
								
								vendor/github.com/golang/protobuf/proto/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										360
									
								
								vendor/github.com/golang/protobuf/proto/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,360 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2012 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// +build purego appengine js
 | 
			
		||||
 | 
			
		||||
// This file contains an implementation of proto field accesses using package reflect.
 | 
			
		||||
// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can
 | 
			
		||||
// be used on App Engine.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const unsafeAllowed = false
 | 
			
		||||
 | 
			
		||||
// A field identifies a field in a struct, accessible from a pointer.
 | 
			
		||||
// In this implementation, a field is identified by the sequence of field indices
 | 
			
		||||
// passed to reflect's FieldByIndex.
 | 
			
		||||
type field []int
 | 
			
		||||
 | 
			
		||||
// toField returns a field equivalent to the given reflect field.
 | 
			
		||||
func toField(f *reflect.StructField) field {
 | 
			
		||||
	return f.Index
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// invalidField is an invalid field identifier.
 | 
			
		||||
var invalidField = field(nil)
 | 
			
		||||
 | 
			
		||||
// zeroField is a noop when calling pointer.offset.
 | 
			
		||||
var zeroField = field([]int{})
 | 
			
		||||
 | 
			
		||||
// IsValid reports whether the field identifier is valid.
 | 
			
		||||
func (f field) IsValid() bool { return f != nil }
 | 
			
		||||
 | 
			
		||||
// The pointer type is for the table-driven decoder.
 | 
			
		||||
// The implementation here uses a reflect.Value of pointer type to
 | 
			
		||||
// create a generic pointer. In pointer_unsafe.go we use unsafe
 | 
			
		||||
// instead of reflect to implement the same (but faster) interface.
 | 
			
		||||
type pointer struct {
 | 
			
		||||
	v reflect.Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// toPointer converts an interface of pointer type to a pointer
 | 
			
		||||
// that points to the same target.
 | 
			
		||||
func toPointer(i *Message) pointer {
 | 
			
		||||
	return pointer{v: reflect.ValueOf(*i)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// toAddrPointer converts an interface to a pointer that points to
 | 
			
		||||
// the interface data.
 | 
			
		||||
func toAddrPointer(i *interface{}, isptr, deref bool) pointer {
 | 
			
		||||
	v := reflect.ValueOf(*i)
 | 
			
		||||
	u := reflect.New(v.Type())
 | 
			
		||||
	u.Elem().Set(v)
 | 
			
		||||
	if deref {
 | 
			
		||||
		u = u.Elem()
 | 
			
		||||
	}
 | 
			
		||||
	return pointer{v: u}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// valToPointer converts v to a pointer.  v must be of pointer type.
 | 
			
		||||
func valToPointer(v reflect.Value) pointer {
 | 
			
		||||
	return pointer{v: v}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// offset converts from a pointer to a structure to a pointer to
 | 
			
		||||
// one of its fields.
 | 
			
		||||
func (p pointer) offset(f field) pointer {
 | 
			
		||||
	return pointer{v: p.v.Elem().FieldByIndex(f).Addr()}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) isNil() bool {
 | 
			
		||||
	return p.v.IsNil()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// grow updates the slice s in place to make it one element longer.
 | 
			
		||||
// s must be addressable.
 | 
			
		||||
// Returns the (addressable) new element.
 | 
			
		||||
func grow(s reflect.Value) reflect.Value {
 | 
			
		||||
	n, m := s.Len(), s.Cap()
 | 
			
		||||
	if n < m {
 | 
			
		||||
		s.SetLen(n + 1)
 | 
			
		||||
	} else {
 | 
			
		||||
		s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem())))
 | 
			
		||||
	}
 | 
			
		||||
	return s.Index(n)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) toInt64() *int64 {
 | 
			
		||||
	return p.v.Interface().(*int64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toInt64Ptr() **int64 {
 | 
			
		||||
	return p.v.Interface().(**int64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toInt64Slice() *[]int64 {
 | 
			
		||||
	return p.v.Interface().(*[]int64)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var int32ptr = reflect.TypeOf((*int32)(nil))
 | 
			
		||||
 | 
			
		||||
func (p pointer) toInt32() *int32 {
 | 
			
		||||
	return p.v.Convert(int32ptr).Interface().(*int32)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The toInt32Ptr/Slice methods don't work because of enums.
 | 
			
		||||
// Instead, we must use set/get methods for the int32ptr/slice case.
 | 
			
		||||
/*
 | 
			
		||||
	func (p pointer) toInt32Ptr() **int32 {
 | 
			
		||||
		return p.v.Interface().(**int32)
 | 
			
		||||
}
 | 
			
		||||
	func (p pointer) toInt32Slice() *[]int32 {
 | 
			
		||||
		return p.v.Interface().(*[]int32)
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
func (p pointer) getInt32Ptr() *int32 {
 | 
			
		||||
	if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) {
 | 
			
		||||
		// raw int32 type
 | 
			
		||||
		return p.v.Elem().Interface().(*int32)
 | 
			
		||||
	}
 | 
			
		||||
	// an enum
 | 
			
		||||
	return p.v.Elem().Convert(int32PtrType).Interface().(*int32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) setInt32Ptr(v int32) {
 | 
			
		||||
	// Allocate value in a *int32. Possibly convert that to a *enum.
 | 
			
		||||
	// Then assign it to a **int32 or **enum.
 | 
			
		||||
	// Note: we can convert *int32 to *enum, but we can't convert
 | 
			
		||||
	// **int32 to **enum!
 | 
			
		||||
	p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem()))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getInt32Slice copies []int32 from p as a new slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_unsafe.go.
 | 
			
		||||
func (p pointer) getInt32Slice() []int32 {
 | 
			
		||||
	if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) {
 | 
			
		||||
		// raw int32 type
 | 
			
		||||
		return p.v.Elem().Interface().([]int32)
 | 
			
		||||
	}
 | 
			
		||||
	// an enum
 | 
			
		||||
	// Allocate a []int32, then assign []enum's values into it.
 | 
			
		||||
	// Note: we can't convert []enum to []int32.
 | 
			
		||||
	slice := p.v.Elem()
 | 
			
		||||
	s := make([]int32, slice.Len())
 | 
			
		||||
	for i := 0; i < slice.Len(); i++ {
 | 
			
		||||
		s[i] = int32(slice.Index(i).Int())
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setInt32Slice copies []int32 into p as a new slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_unsafe.go.
 | 
			
		||||
func (p pointer) setInt32Slice(v []int32) {
 | 
			
		||||
	if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) {
 | 
			
		||||
		// raw int32 type
 | 
			
		||||
		p.v.Elem().Set(reflect.ValueOf(v))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// an enum
 | 
			
		||||
	// Allocate a []enum, then assign []int32's values into it.
 | 
			
		||||
	// Note: we can't convert []enum to []int32.
 | 
			
		||||
	slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v))
 | 
			
		||||
	for i, x := range v {
 | 
			
		||||
		slice.Index(i).SetInt(int64(x))
 | 
			
		||||
	}
 | 
			
		||||
	p.v.Elem().Set(slice)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) appendInt32Slice(v int32) {
 | 
			
		||||
	grow(p.v.Elem()).SetInt(int64(v))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) toUint64() *uint64 {
 | 
			
		||||
	return p.v.Interface().(*uint64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint64Ptr() **uint64 {
 | 
			
		||||
	return p.v.Interface().(**uint64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint64Slice() *[]uint64 {
 | 
			
		||||
	return p.v.Interface().(*[]uint64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32() *uint32 {
 | 
			
		||||
	return p.v.Interface().(*uint32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32Ptr() **uint32 {
 | 
			
		||||
	return p.v.Interface().(**uint32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32Slice() *[]uint32 {
 | 
			
		||||
	return p.v.Interface().(*[]uint32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBool() *bool {
 | 
			
		||||
	return p.v.Interface().(*bool)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBoolPtr() **bool {
 | 
			
		||||
	return p.v.Interface().(**bool)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBoolSlice() *[]bool {
 | 
			
		||||
	return p.v.Interface().(*[]bool)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64() *float64 {
 | 
			
		||||
	return p.v.Interface().(*float64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64Ptr() **float64 {
 | 
			
		||||
	return p.v.Interface().(**float64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64Slice() *[]float64 {
 | 
			
		||||
	return p.v.Interface().(*[]float64)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32() *float32 {
 | 
			
		||||
	return p.v.Interface().(*float32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32Ptr() **float32 {
 | 
			
		||||
	return p.v.Interface().(**float32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32Slice() *[]float32 {
 | 
			
		||||
	return p.v.Interface().(*[]float32)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toString() *string {
 | 
			
		||||
	return p.v.Interface().(*string)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toStringPtr() **string {
 | 
			
		||||
	return p.v.Interface().(**string)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toStringSlice() *[]string {
 | 
			
		||||
	return p.v.Interface().(*[]string)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBytes() *[]byte {
 | 
			
		||||
	return p.v.Interface().(*[]byte)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBytesSlice() *[][]byte {
 | 
			
		||||
	return p.v.Interface().(*[][]byte)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toExtensions() *XXX_InternalExtensions {
 | 
			
		||||
	return p.v.Interface().(*XXX_InternalExtensions)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toOldExtensions() *map[int32]Extension {
 | 
			
		||||
	return p.v.Interface().(*map[int32]Extension)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) getPointer() pointer {
 | 
			
		||||
	return pointer{v: p.v.Elem()}
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) setPointer(q pointer) {
 | 
			
		||||
	p.v.Elem().Set(q.v)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) appendPointer(q pointer) {
 | 
			
		||||
	grow(p.v.Elem()).Set(q.v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getPointerSlice copies []*T from p as a new []pointer.
 | 
			
		||||
// This behavior differs from the implementation in pointer_unsafe.go.
 | 
			
		||||
func (p pointer) getPointerSlice() []pointer {
 | 
			
		||||
	if p.v.IsNil() {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	n := p.v.Elem().Len()
 | 
			
		||||
	s := make([]pointer, n)
 | 
			
		||||
	for i := 0; i < n; i++ {
 | 
			
		||||
		s[i] = pointer{v: p.v.Elem().Index(i)}
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setPointerSlice copies []pointer into p as a new []*T.
 | 
			
		||||
// This behavior differs from the implementation in pointer_unsafe.go.
 | 
			
		||||
func (p pointer) setPointerSlice(v []pointer) {
 | 
			
		||||
	if v == nil {
 | 
			
		||||
		p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v))
 | 
			
		||||
	for _, p := range v {
 | 
			
		||||
		s = reflect.Append(s, p.v)
 | 
			
		||||
	}
 | 
			
		||||
	p.v.Elem().Set(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getInterfacePointer returns a pointer that points to the
 | 
			
		||||
// interface data of the interface pointed by p.
 | 
			
		||||
func (p pointer) getInterfacePointer() pointer {
 | 
			
		||||
	if p.v.Elem().IsNil() {
 | 
			
		||||
		return pointer{v: p.v.Elem()}
 | 
			
		||||
	}
 | 
			
		||||
	return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) asPointerTo(t reflect.Type) reflect.Value {
 | 
			
		||||
	// TODO: check that p.v.Type().Elem() == t?
 | 
			
		||||
	return p.v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	return *p
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	*p = v
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	return *p
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	*p = v
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	return *p
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	*p = v
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadDiscardInfo(p **discardInfo) *discardInfo {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	return *p
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) {
 | 
			
		||||
	atomicLock.Lock()
 | 
			
		||||
	defer atomicLock.Unlock()
 | 
			
		||||
	*p = v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var atomicLock sync.Mutex
 | 
			
		||||
							
								
								
									
										313
									
								
								vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										313
									
								
								vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,313 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2012 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// +build !purego,!appengine,!js
 | 
			
		||||
 | 
			
		||||
// This file contains the implementation of the proto field accesses using package unsafe.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const unsafeAllowed = true
 | 
			
		||||
 | 
			
		||||
// A field identifies a field in a struct, accessible from a pointer.
 | 
			
		||||
// In this implementation, a field is identified by its byte offset from the start of the struct.
 | 
			
		||||
type field uintptr
 | 
			
		||||
 | 
			
		||||
// toField returns a field equivalent to the given reflect field.
 | 
			
		||||
func toField(f *reflect.StructField) field {
 | 
			
		||||
	return field(f.Offset)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// invalidField is an invalid field identifier.
 | 
			
		||||
const invalidField = ^field(0)
 | 
			
		||||
 | 
			
		||||
// zeroField is a noop when calling pointer.offset.
 | 
			
		||||
const zeroField = field(0)
 | 
			
		||||
 | 
			
		||||
// IsValid reports whether the field identifier is valid.
 | 
			
		||||
func (f field) IsValid() bool {
 | 
			
		||||
	return f != invalidField
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The pointer type below is for the new table-driven encoder/decoder.
 | 
			
		||||
// The implementation here uses unsafe.Pointer to create a generic pointer.
 | 
			
		||||
// In pointer_reflect.go we use reflect instead of unsafe to implement
 | 
			
		||||
// the same (but slower) interface.
 | 
			
		||||
type pointer struct {
 | 
			
		||||
	p unsafe.Pointer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// size of pointer
 | 
			
		||||
var ptrSize = unsafe.Sizeof(uintptr(0))
 | 
			
		||||
 | 
			
		||||
// toPointer converts an interface of pointer type to a pointer
 | 
			
		||||
// that points to the same target.
 | 
			
		||||
func toPointer(i *Message) pointer {
 | 
			
		||||
	// Super-tricky - read pointer out of data word of interface value.
 | 
			
		||||
	// Saves ~25ns over the equivalent:
 | 
			
		||||
	// return valToPointer(reflect.ValueOf(*i))
 | 
			
		||||
	return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// toAddrPointer converts an interface to a pointer that points to
 | 
			
		||||
// the interface data.
 | 
			
		||||
func toAddrPointer(i *interface{}, isptr, deref bool) (p pointer) {
 | 
			
		||||
	// Super-tricky - read or get the address of data word of interface value.
 | 
			
		||||
	if isptr {
 | 
			
		||||
		// The interface is of pointer type, thus it is a direct interface.
 | 
			
		||||
		// The data word is the pointer data itself. We take its address.
 | 
			
		||||
		p = pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)}
 | 
			
		||||
	} else {
 | 
			
		||||
		// The interface is not of pointer type. The data word is the pointer
 | 
			
		||||
		// to the data.
 | 
			
		||||
		p = pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]}
 | 
			
		||||
	}
 | 
			
		||||
	if deref {
 | 
			
		||||
		p.p = *(*unsafe.Pointer)(p.p)
 | 
			
		||||
	}
 | 
			
		||||
	return p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// valToPointer converts v to a pointer. v must be of pointer type.
 | 
			
		||||
func valToPointer(v reflect.Value) pointer {
 | 
			
		||||
	return pointer{p: unsafe.Pointer(v.Pointer())}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// offset converts from a pointer to a structure to a pointer to
 | 
			
		||||
// one of its fields.
 | 
			
		||||
func (p pointer) offset(f field) pointer {
 | 
			
		||||
	// For safety, we should panic if !f.IsValid, however calling panic causes
 | 
			
		||||
	// this to no longer be inlineable, which is a serious performance cost.
 | 
			
		||||
	/*
 | 
			
		||||
		if !f.IsValid() {
 | 
			
		||||
			panic("invalid field")
 | 
			
		||||
		}
 | 
			
		||||
	*/
 | 
			
		||||
	return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) isNil() bool {
 | 
			
		||||
	return p.p == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) toInt64() *int64 {
 | 
			
		||||
	return (*int64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toInt64Ptr() **int64 {
 | 
			
		||||
	return (**int64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toInt64Slice() *[]int64 {
 | 
			
		||||
	return (*[]int64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toInt32() *int32 {
 | 
			
		||||
	return (*int32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist.
 | 
			
		||||
/*
 | 
			
		||||
	func (p pointer) toInt32Ptr() **int32 {
 | 
			
		||||
		return (**int32)(p.p)
 | 
			
		||||
	}
 | 
			
		||||
	func (p pointer) toInt32Slice() *[]int32 {
 | 
			
		||||
		return (*[]int32)(p.p)
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
func (p pointer) getInt32Ptr() *int32 {
 | 
			
		||||
	return *(**int32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) setInt32Ptr(v int32) {
 | 
			
		||||
	*(**int32)(p.p) = &v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getInt32Slice loads a []int32 from p.
 | 
			
		||||
// The value returned is aliased with the original slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_reflect.go.
 | 
			
		||||
func (p pointer) getInt32Slice() []int32 {
 | 
			
		||||
	return *(*[]int32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setInt32Slice stores a []int32 to p.
 | 
			
		||||
// The value set is aliased with the input slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_reflect.go.
 | 
			
		||||
func (p pointer) setInt32Slice(v []int32) {
 | 
			
		||||
	*(*[]int32)(p.p) = v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead?
 | 
			
		||||
func (p pointer) appendInt32Slice(v int32) {
 | 
			
		||||
	s := (*[]int32)(p.p)
 | 
			
		||||
	*s = append(*s, v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p pointer) toUint64() *uint64 {
 | 
			
		||||
	return (*uint64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint64Ptr() **uint64 {
 | 
			
		||||
	return (**uint64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint64Slice() *[]uint64 {
 | 
			
		||||
	return (*[]uint64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32() *uint32 {
 | 
			
		||||
	return (*uint32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32Ptr() **uint32 {
 | 
			
		||||
	return (**uint32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toUint32Slice() *[]uint32 {
 | 
			
		||||
	return (*[]uint32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBool() *bool {
 | 
			
		||||
	return (*bool)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBoolPtr() **bool {
 | 
			
		||||
	return (**bool)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBoolSlice() *[]bool {
 | 
			
		||||
	return (*[]bool)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64() *float64 {
 | 
			
		||||
	return (*float64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64Ptr() **float64 {
 | 
			
		||||
	return (**float64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat64Slice() *[]float64 {
 | 
			
		||||
	return (*[]float64)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32() *float32 {
 | 
			
		||||
	return (*float32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32Ptr() **float32 {
 | 
			
		||||
	return (**float32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toFloat32Slice() *[]float32 {
 | 
			
		||||
	return (*[]float32)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toString() *string {
 | 
			
		||||
	return (*string)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toStringPtr() **string {
 | 
			
		||||
	return (**string)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toStringSlice() *[]string {
 | 
			
		||||
	return (*[]string)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBytes() *[]byte {
 | 
			
		||||
	return (*[]byte)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toBytesSlice() *[][]byte {
 | 
			
		||||
	return (*[][]byte)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toExtensions() *XXX_InternalExtensions {
 | 
			
		||||
	return (*XXX_InternalExtensions)(p.p)
 | 
			
		||||
}
 | 
			
		||||
func (p pointer) toOldExtensions() *map[int32]Extension {
 | 
			
		||||
	return (*map[int32]Extension)(p.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getPointerSlice loads []*T from p as a []pointer.
 | 
			
		||||
// The value returned is aliased with the original slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_reflect.go.
 | 
			
		||||
func (p pointer) getPointerSlice() []pointer {
 | 
			
		||||
	// Super-tricky - p should point to a []*T where T is a
 | 
			
		||||
	// message type. We load it as []pointer.
 | 
			
		||||
	return *(*[]pointer)(p.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setPointerSlice stores []pointer into p as a []*T.
 | 
			
		||||
// The value set is aliased with the input slice.
 | 
			
		||||
// This behavior differs from the implementation in pointer_reflect.go.
 | 
			
		||||
func (p pointer) setPointerSlice(v []pointer) {
 | 
			
		||||
	// Super-tricky - p should point to a []*T where T is a
 | 
			
		||||
	// message type. We store it as []pointer.
 | 
			
		||||
	*(*[]pointer)(p.p) = v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getPointer loads the pointer at p and returns it.
 | 
			
		||||
func (p pointer) getPointer() pointer {
 | 
			
		||||
	return pointer{p: *(*unsafe.Pointer)(p.p)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// setPointer stores the pointer q at p.
 | 
			
		||||
func (p pointer) setPointer(q pointer) {
 | 
			
		||||
	*(*unsafe.Pointer)(p.p) = q.p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// append q to the slice pointed to by p.
 | 
			
		||||
func (p pointer) appendPointer(q pointer) {
 | 
			
		||||
	s := (*[]unsafe.Pointer)(p.p)
 | 
			
		||||
	*s = append(*s, q.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getInterfacePointer returns a pointer that points to the
 | 
			
		||||
// interface data of the interface pointed by p.
 | 
			
		||||
func (p pointer) getInterfacePointer() pointer {
 | 
			
		||||
	// Super-tricky - read pointer out of data word of interface value.
 | 
			
		||||
	return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// asPointerTo returns a reflect.Value that is a pointer to an
 | 
			
		||||
// object of type t stored at p.
 | 
			
		||||
func (p pointer) asPointerTo(t reflect.Type) reflect.Value {
 | 
			
		||||
	return reflect.NewAt(t, p.p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo {
 | 
			
		||||
	return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) {
 | 
			
		||||
	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v))
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo {
 | 
			
		||||
	return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) {
 | 
			
		||||
	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v))
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo {
 | 
			
		||||
	return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) {
 | 
			
		||||
	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v))
 | 
			
		||||
}
 | 
			
		||||
func atomicLoadDiscardInfo(p **discardInfo) *discardInfo {
 | 
			
		||||
	return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
 | 
			
		||||
}
 | 
			
		||||
func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) {
 | 
			
		||||
	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										652
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										652
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,162 +1,104 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Routines for encoding data into the wire format for protocol buffers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const debug bool = false
 | 
			
		||||
 | 
			
		||||
// Constants that identify the encoding of a value on the wire.
 | 
			
		||||
const (
 | 
			
		||||
	WireVarint     = 0
 | 
			
		||||
	WireFixed64    = 1
 | 
			
		||||
	WireBytes      = 2
 | 
			
		||||
	WireStartGroup = 3
 | 
			
		||||
	WireEndGroup   = 4
 | 
			
		||||
	WireFixed32    = 5
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// tagMap is an optimization over map[int]int for typical protocol buffer
 | 
			
		||||
// use-cases. Encoded protocol buffers are often in tag order with small tag
 | 
			
		||||
// numbers.
 | 
			
		||||
type tagMap struct {
 | 
			
		||||
	fastTags []int
 | 
			
		||||
	slowTags map[int]int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tagMapFastLimit is the upper bound on the tag number that will be stored in
 | 
			
		||||
// the tagMap slice rather than its map.
 | 
			
		||||
const tagMapFastLimit = 1024
 | 
			
		||||
 | 
			
		||||
func (p *tagMap) get(t int) (int, bool) {
 | 
			
		||||
	if t > 0 && t < tagMapFastLimit {
 | 
			
		||||
		if t >= len(p.fastTags) {
 | 
			
		||||
			return 0, false
 | 
			
		||||
		}
 | 
			
		||||
		fi := p.fastTags[t]
 | 
			
		||||
		return fi, fi >= 0
 | 
			
		||||
	}
 | 
			
		||||
	fi, ok := p.slowTags[t]
 | 
			
		||||
	return fi, ok
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *tagMap) put(t int, fi int) {
 | 
			
		||||
	if t > 0 && t < tagMapFastLimit {
 | 
			
		||||
		for len(p.fastTags) < t+1 {
 | 
			
		||||
			p.fastTags = append(p.fastTags, -1)
 | 
			
		||||
		}
 | 
			
		||||
		p.fastTags[t] = fi
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if p.slowTags == nil {
 | 
			
		||||
		p.slowTags = make(map[int]int)
 | 
			
		||||
	}
 | 
			
		||||
	p.slowTags[t] = fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StructProperties represents properties for all the fields of a struct.
 | 
			
		||||
// decoderTags and decoderOrigNames should only be used by the decoder.
 | 
			
		||||
// StructProperties represents protocol buffer type information for a
 | 
			
		||||
// generated protobuf message in the open-struct API.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
type StructProperties struct {
 | 
			
		||||
	Prop             []*Properties  // properties for each field
 | 
			
		||||
	reqCount         int            // required count
 | 
			
		||||
	decoderTags      tagMap         // map from proto tag to struct field number
 | 
			
		||||
	decoderOrigNames map[string]int // map from original name to struct field number
 | 
			
		||||
	order            []int          // list of struct field numbers in tag order
 | 
			
		||||
	// Prop are the properties for each field.
 | 
			
		||||
	//
 | 
			
		||||
	// Fields belonging to a oneof are stored in OneofTypes instead, with a
 | 
			
		||||
	// single Properties representing the parent oneof held here.
 | 
			
		||||
	//
 | 
			
		||||
	// The order of Prop matches the order of fields in the Go struct.
 | 
			
		||||
	// Struct fields that are not related to protobufs have a "XXX_" prefix
 | 
			
		||||
	// in the Properties.Name and must be ignored by the user.
 | 
			
		||||
	Prop []*Properties
 | 
			
		||||
 | 
			
		||||
	// OneofTypes contains information about the oneof fields in this message.
 | 
			
		||||
	// It is keyed by the original name of a field.
 | 
			
		||||
	// It is keyed by the protobuf field name.
 | 
			
		||||
	OneofTypes map[string]*OneofProperties
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OneofProperties represents information about a specific field in a oneof.
 | 
			
		||||
type OneofProperties struct {
 | 
			
		||||
	Type  reflect.Type // pointer to generated struct type for this oneof field
 | 
			
		||||
	Field int          // struct field number of the containing oneof in the message
 | 
			
		||||
	Prop  *Properties
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec.
 | 
			
		||||
// See encode.go, (*Buffer).enc_struct.
 | 
			
		||||
 | 
			
		||||
func (sp *StructProperties) Len() int { return len(sp.order) }
 | 
			
		||||
func (sp *StructProperties) Less(i, j int) bool {
 | 
			
		||||
	return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag
 | 
			
		||||
}
 | 
			
		||||
func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] }
 | 
			
		||||
 | 
			
		||||
// Properties represents the protocol-specific behavior of a single struct field.
 | 
			
		||||
// Properties represents the type information for a protobuf message field.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
type Properties struct {
 | 
			
		||||
	Name     string // name of the field, for error messages
 | 
			
		||||
	OrigName string // original name before protocol compiler (always set)
 | 
			
		||||
	JSONName string // name to use for JSON; determined by protoc
 | 
			
		||||
	Wire     string
 | 
			
		||||
	// Name is a placeholder name with little meaningful semantic value.
 | 
			
		||||
	// If the name has an "XXX_" prefix, the entire Properties must be ignored.
 | 
			
		||||
	Name string
 | 
			
		||||
	// OrigName is the protobuf field name or oneof name.
 | 
			
		||||
	OrigName string
 | 
			
		||||
	// JSONName is the JSON name for the protobuf field.
 | 
			
		||||
	JSONName string
 | 
			
		||||
	// Enum is a placeholder name for enums.
 | 
			
		||||
	// For historical reasons, this is neither the Go name for the enum,
 | 
			
		||||
	// nor the protobuf name for the enum.
 | 
			
		||||
	Enum string // Deprecated: Do not use.
 | 
			
		||||
	// Weak contains the full name of the weakly referenced message.
 | 
			
		||||
	Weak string
 | 
			
		||||
	// Wire is a string representation of the wire type.
 | 
			
		||||
	Wire string
 | 
			
		||||
	// WireType is the protobuf wire type for the field.
 | 
			
		||||
	WireType int
 | 
			
		||||
	Tag      int
 | 
			
		||||
	// Tag is the protobuf field number.
 | 
			
		||||
	Tag int
 | 
			
		||||
	// Required reports whether this is a required field.
 | 
			
		||||
	Required bool
 | 
			
		||||
	// Optional reports whether this is a optional field.
 | 
			
		||||
	Optional bool
 | 
			
		||||
	// Repeated reports whether this is a repeated field.
 | 
			
		||||
	Repeated bool
 | 
			
		||||
	Packed   bool   // relevant for repeated primitives only
 | 
			
		||||
	Enum     string // set for enum types only
 | 
			
		||||
	proto3   bool   // whether this is known to be a proto3 field
 | 
			
		||||
	oneof    bool   // whether this is a oneof field
 | 
			
		||||
	// Packed reports whether this is a packed repeated field of scalars.
 | 
			
		||||
	Packed bool
 | 
			
		||||
	// Proto3 reports whether this field operates under the proto3 syntax.
 | 
			
		||||
	Proto3 bool
 | 
			
		||||
	// Oneof reports whether this field belongs within a oneof.
 | 
			
		||||
	Oneof bool
 | 
			
		||||
 | 
			
		||||
	Default    string // default value
 | 
			
		||||
	HasDefault bool   // whether an explicit default was provided
 | 
			
		||||
	// Default is the default value in string form.
 | 
			
		||||
	Default string
 | 
			
		||||
	// HasDefault reports whether the field has a default value.
 | 
			
		||||
	HasDefault bool
 | 
			
		||||
 | 
			
		||||
	stype reflect.Type      // set for struct types only
 | 
			
		||||
	sprop *StructProperties // set for struct types only
 | 
			
		||||
	// MapKeyProp is the properties for the key field for a map field.
 | 
			
		||||
	MapKeyProp *Properties
 | 
			
		||||
	// MapValProp is the properties for the value field for a map field.
 | 
			
		||||
	MapValProp *Properties
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	mtype      reflect.Type // set for map types only
 | 
			
		||||
	MapKeyProp *Properties  // set for map types only
 | 
			
		||||
	MapValProp *Properties  // set for map types only
 | 
			
		||||
// OneofProperties represents the type information for a protobuf oneof.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
type OneofProperties struct {
 | 
			
		||||
	// Type is a pointer to the generated wrapper type for the field value.
 | 
			
		||||
	// This is nil for messages that are not in the open-struct API.
 | 
			
		||||
	Type reflect.Type
 | 
			
		||||
	// Field is the index into StructProperties.Prop for the containing oneof.
 | 
			
		||||
	Field int
 | 
			
		||||
	// Prop is the properties for the field.
 | 
			
		||||
	Prop *Properties
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String formats the properties in the protobuf struct field tag style.
 | 
			
		||||
func (p *Properties) String() string {
 | 
			
		||||
	s := p.Wire
 | 
			
		||||
	s += ","
 | 
			
		||||
	s += strconv.Itoa(p.Tag)
 | 
			
		||||
	s += "," + strconv.Itoa(p.Tag)
 | 
			
		||||
	if p.Required {
 | 
			
		||||
		s += ",req"
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -170,18 +112,21 @@ func (p *Properties) String() string {
 | 
			
		|||
		s += ",packed"
 | 
			
		||||
	}
 | 
			
		||||
	s += ",name=" + p.OrigName
 | 
			
		||||
	if p.JSONName != p.OrigName {
 | 
			
		||||
	if p.JSONName != "" {
 | 
			
		||||
		s += ",json=" + p.JSONName
 | 
			
		||||
	}
 | 
			
		||||
	if p.proto3 {
 | 
			
		||||
		s += ",proto3"
 | 
			
		||||
	}
 | 
			
		||||
	if p.oneof {
 | 
			
		||||
		s += ",oneof"
 | 
			
		||||
	}
 | 
			
		||||
	if len(p.Enum) > 0 {
 | 
			
		||||
		s += ",enum=" + p.Enum
 | 
			
		||||
	}
 | 
			
		||||
	if len(p.Weak) > 0 {
 | 
			
		||||
		s += ",weak=" + p.Weak
 | 
			
		||||
	}
 | 
			
		||||
	if p.Proto3 {
 | 
			
		||||
		s += ",proto3"
 | 
			
		||||
	}
 | 
			
		||||
	if p.Oneof {
 | 
			
		||||
		s += ",oneof"
 | 
			
		||||
	}
 | 
			
		||||
	if p.HasDefault {
 | 
			
		||||
		s += ",def=" + p.Default
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -189,356 +134,173 @@ func (p *Properties) String() string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Parse populates p by parsing a string in the protobuf struct field tag style.
 | 
			
		||||
func (p *Properties) Parse(s string) {
 | 
			
		||||
	// "bytes,49,opt,name=foo,def=hello!"
 | 
			
		||||
	fields := strings.Split(s, ",") // breaks def=, but handled below.
 | 
			
		||||
	if len(fields) < 2 {
 | 
			
		||||
		log.Printf("proto: tag has too few fields: %q", s)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p.Wire = fields[0]
 | 
			
		||||
	switch p.Wire {
 | 
			
		||||
	case "varint":
 | 
			
		||||
		p.WireType = WireVarint
 | 
			
		||||
	case "fixed32":
 | 
			
		||||
		p.WireType = WireFixed32
 | 
			
		||||
	case "fixed64":
 | 
			
		||||
		p.WireType = WireFixed64
 | 
			
		||||
	case "zigzag32":
 | 
			
		||||
		p.WireType = WireVarint
 | 
			
		||||
	case "zigzag64":
 | 
			
		||||
		p.WireType = WireVarint
 | 
			
		||||
	case "bytes", "group":
 | 
			
		||||
		p.WireType = WireBytes
 | 
			
		||||
		// no numeric converter for non-numeric types
 | 
			
		||||
	default:
 | 
			
		||||
		log.Printf("proto: tag has unknown wire type: %q", s)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	p.Tag, err = strconv.Atoi(fields[1])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
outer:
 | 
			
		||||
	for i := 2; i < len(fields); i++ {
 | 
			
		||||
		f := fields[i]
 | 
			
		||||
		switch {
 | 
			
		||||
		case f == "req":
 | 
			
		||||
			p.Required = true
 | 
			
		||||
		case f == "opt":
 | 
			
		||||
func (p *Properties) Parse(tag string) {
 | 
			
		||||
	// For example: "bytes,49,opt,name=foo,def=hello!"
 | 
			
		||||
	for len(tag) > 0 {
 | 
			
		||||
		i := strings.IndexByte(tag, ',')
 | 
			
		||||
		if i < 0 {
 | 
			
		||||
			i = len(tag)
 | 
			
		||||
		}
 | 
			
		||||
		switch s := tag[:i]; {
 | 
			
		||||
		case strings.HasPrefix(s, "name="):
 | 
			
		||||
			p.OrigName = s[len("name="):]
 | 
			
		||||
		case strings.HasPrefix(s, "json="):
 | 
			
		||||
			p.JSONName = s[len("json="):]
 | 
			
		||||
		case strings.HasPrefix(s, "enum="):
 | 
			
		||||
			p.Enum = s[len("enum="):]
 | 
			
		||||
		case strings.HasPrefix(s, "weak="):
 | 
			
		||||
			p.Weak = s[len("weak="):]
 | 
			
		||||
		case strings.Trim(s, "0123456789") == "":
 | 
			
		||||
			n, _ := strconv.ParseUint(s, 10, 32)
 | 
			
		||||
			p.Tag = int(n)
 | 
			
		||||
		case s == "opt":
 | 
			
		||||
			p.Optional = true
 | 
			
		||||
		case f == "rep":
 | 
			
		||||
		case s == "req":
 | 
			
		||||
			p.Required = true
 | 
			
		||||
		case s == "rep":
 | 
			
		||||
			p.Repeated = true
 | 
			
		||||
		case f == "packed":
 | 
			
		||||
		case s == "varint" || s == "zigzag32" || s == "zigzag64":
 | 
			
		||||
			p.Wire = s
 | 
			
		||||
			p.WireType = WireVarint
 | 
			
		||||
		case s == "fixed32":
 | 
			
		||||
			p.Wire = s
 | 
			
		||||
			p.WireType = WireFixed32
 | 
			
		||||
		case s == "fixed64":
 | 
			
		||||
			p.Wire = s
 | 
			
		||||
			p.WireType = WireFixed64
 | 
			
		||||
		case s == "bytes":
 | 
			
		||||
			p.Wire = s
 | 
			
		||||
			p.WireType = WireBytes
 | 
			
		||||
		case s == "group":
 | 
			
		||||
			p.Wire = s
 | 
			
		||||
			p.WireType = WireStartGroup
 | 
			
		||||
		case s == "packed":
 | 
			
		||||
			p.Packed = true
 | 
			
		||||
		case strings.HasPrefix(f, "name="):
 | 
			
		||||
			p.OrigName = f[5:]
 | 
			
		||||
		case strings.HasPrefix(f, "json="):
 | 
			
		||||
			p.JSONName = f[5:]
 | 
			
		||||
		case strings.HasPrefix(f, "enum="):
 | 
			
		||||
			p.Enum = f[5:]
 | 
			
		||||
		case f == "proto3":
 | 
			
		||||
			p.proto3 = true
 | 
			
		||||
		case f == "oneof":
 | 
			
		||||
			p.oneof = true
 | 
			
		||||
		case strings.HasPrefix(f, "def="):
 | 
			
		||||
		case s == "proto3":
 | 
			
		||||
			p.Proto3 = true
 | 
			
		||||
		case s == "oneof":
 | 
			
		||||
			p.Oneof = true
 | 
			
		||||
		case strings.HasPrefix(s, "def="):
 | 
			
		||||
			// The default tag is special in that everything afterwards is the
 | 
			
		||||
			// default regardless of the presence of commas.
 | 
			
		||||
			p.HasDefault = true
 | 
			
		||||
			p.Default = f[4:] // rest of string
 | 
			
		||||
			if i+1 < len(fields) {
 | 
			
		||||
				// Commas aren't escaped, and def is always last.
 | 
			
		||||
				p.Default += "," + strings.Join(fields[i+1:], ",")
 | 
			
		||||
				break outer
 | 
			
		||||
			}
 | 
			
		||||
			p.Default, i = tag[len("def="):], len(tag)
 | 
			
		||||
		}
 | 
			
		||||
		tag = strings.TrimPrefix(tag[i:], ",")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem()
 | 
			
		||||
 | 
			
		||||
// setFieldProps initializes the field properties for submessages and maps.
 | 
			
		||||
func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) {
 | 
			
		||||
	switch t1 := typ; t1.Kind() {
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		if t1.Elem().Kind() == reflect.Struct {
 | 
			
		||||
			p.stype = t1.Elem()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct {
 | 
			
		||||
			p.stype = t2.Elem()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case reflect.Map:
 | 
			
		||||
		p.mtype = t1
 | 
			
		||||
		p.MapKeyProp = &Properties{}
 | 
			
		||||
		p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp)
 | 
			
		||||
		p.MapValProp = &Properties{}
 | 
			
		||||
		vtype := p.mtype.Elem()
 | 
			
		||||
		if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice {
 | 
			
		||||
			// The value type is not a message (*T) or bytes ([]byte),
 | 
			
		||||
			// so we need encoders for the pointer to this type.
 | 
			
		||||
			vtype = reflect.PtrTo(vtype)
 | 
			
		||||
		}
 | 
			
		||||
		p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if p.stype != nil {
 | 
			
		||||
		if lockGetProp {
 | 
			
		||||
			p.sprop = GetProperties(p.stype)
 | 
			
		||||
		} else {
 | 
			
		||||
			p.sprop = getPropertiesLocked(p.stype)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem()
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Init populates the properties from a protocol buffer struct tag.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) {
 | 
			
		||||
	p.init(typ, name, tag, f, true)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) {
 | 
			
		||||
	// "bytes,49,opt,def=hello!"
 | 
			
		||||
	p.Name = name
 | 
			
		||||
	p.OrigName = name
 | 
			
		||||
	if tag == "" {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	p.Parse(tag)
 | 
			
		||||
	p.setFieldProps(typ, f, lockGetProp)
 | 
			
		||||
 | 
			
		||||
	if typ != nil && typ.Kind() == reflect.Map {
 | 
			
		||||
		p.MapKeyProp = new(Properties)
 | 
			
		||||
		p.MapKeyProp.Init(nil, "Key", f.Tag.Get("protobuf_key"), nil)
 | 
			
		||||
		p.MapValProp = new(Properties)
 | 
			
		||||
		p.MapValProp.Init(nil, "Value", f.Tag.Get("protobuf_val"), nil)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	propertiesMu  sync.RWMutex
 | 
			
		||||
	propertiesMap = make(map[reflect.Type]*StructProperties)
 | 
			
		||||
)
 | 
			
		||||
var propertiesCache sync.Map // map[reflect.Type]*StructProperties
 | 
			
		||||
 | 
			
		||||
// GetProperties returns the list of properties for the type represented by t.
 | 
			
		||||
// t must represent a generated struct type of a protocol message.
 | 
			
		||||
// GetProperties returns the list of properties for the type represented by t,
 | 
			
		||||
// which must be a generated protocol buffer message in the open-struct API,
 | 
			
		||||
// where protobuf message fields are represented by exported Go struct fields.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protobuf reflection instead.
 | 
			
		||||
func GetProperties(t reflect.Type) *StructProperties {
 | 
			
		||||
	if t.Kind() != reflect.Struct {
 | 
			
		||||
		panic("proto: type must have kind struct")
 | 
			
		||||
	if p, ok := propertiesCache.Load(t); ok {
 | 
			
		||||
		return p.(*StructProperties)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Most calls to GetProperties in a long-running program will be
 | 
			
		||||
	// retrieving details for types we have seen before.
 | 
			
		||||
	propertiesMu.RLock()
 | 
			
		||||
	sprop, ok := propertiesMap[t]
 | 
			
		||||
	propertiesMu.RUnlock()
 | 
			
		||||
	if ok {
 | 
			
		||||
		return sprop
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	propertiesMu.Lock()
 | 
			
		||||
	sprop = getPropertiesLocked(t)
 | 
			
		||||
	propertiesMu.Unlock()
 | 
			
		||||
	return sprop
 | 
			
		||||
	p, _ := propertiesCache.LoadOrStore(t, newProperties(t))
 | 
			
		||||
	return p.(*StructProperties)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	oneofFuncsIface interface {
 | 
			
		||||
		XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})
 | 
			
		||||
	}
 | 
			
		||||
	oneofWrappersIface interface {
 | 
			
		||||
		XXX_OneofWrappers() []interface{}
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// getPropertiesLocked requires that propertiesMu is held.
 | 
			
		||||
func getPropertiesLocked(t reflect.Type) *StructProperties {
 | 
			
		||||
	if prop, ok := propertiesMap[t]; ok {
 | 
			
		||||
		return prop
 | 
			
		||||
func newProperties(t reflect.Type) *StructProperties {
 | 
			
		||||
	if t.Kind() != reflect.Struct {
 | 
			
		||||
		panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var hasOneof bool
 | 
			
		||||
	prop := new(StructProperties)
 | 
			
		||||
	// in case of recursive protos, fill this in now.
 | 
			
		||||
	propertiesMap[t] = prop
 | 
			
		||||
 | 
			
		||||
	// build properties
 | 
			
		||||
	prop.Prop = make([]*Properties, t.NumField())
 | 
			
		||||
	prop.order = make([]int, t.NumField())
 | 
			
		||||
 | 
			
		||||
	// Construct a list of properties for each field in the struct.
 | 
			
		||||
	for i := 0; i < t.NumField(); i++ {
 | 
			
		||||
		f := t.Field(i)
 | 
			
		||||
		p := new(Properties)
 | 
			
		||||
		name := f.Name
 | 
			
		||||
		p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false)
 | 
			
		||||
		f := t.Field(i)
 | 
			
		||||
		tagField := f.Tag.Get("protobuf")
 | 
			
		||||
		p.Init(f.Type, f.Name, tagField, &f)
 | 
			
		||||
 | 
			
		||||
		oneof := f.Tag.Get("protobuf_oneof") // special case
 | 
			
		||||
		if oneof != "" {
 | 
			
		||||
			// Oneof fields don't use the traditional protobuf tag.
 | 
			
		||||
			p.OrigName = oneof
 | 
			
		||||
		tagOneof := f.Tag.Get("protobuf_oneof")
 | 
			
		||||
		if tagOneof != "" {
 | 
			
		||||
			hasOneof = true
 | 
			
		||||
			p.OrigName = tagOneof
 | 
			
		||||
		}
 | 
			
		||||
		prop.Prop[i] = p
 | 
			
		||||
		prop.order[i] = i
 | 
			
		||||
		if debug {
 | 
			
		||||
			print(i, " ", f.Name, " ", t.String(), " ")
 | 
			
		||||
			if p.Tag > 0 {
 | 
			
		||||
				print(p.String())
 | 
			
		||||
 | 
			
		||||
		// Rename unrelated struct fields with the "XXX_" prefix since so much
 | 
			
		||||
		// user code simply checks for this to exclude special fields.
 | 
			
		||||
		if tagField == "" && tagOneof == "" && !strings.HasPrefix(p.Name, "XXX_") {
 | 
			
		||||
			p.Name = "XXX_" + p.Name
 | 
			
		||||
			p.OrigName = "XXX_" + p.OrigName
 | 
			
		||||
		} else if p.Weak != "" {
 | 
			
		||||
			p.Name = p.OrigName // avoid possible "XXX_" prefix on weak field
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		prop.Prop = append(prop.Prop, p)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Construct a mapping of oneof field names to properties.
 | 
			
		||||
	if hasOneof {
 | 
			
		||||
		var oneofWrappers []interface{}
 | 
			
		||||
		if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok {
 | 
			
		||||
			oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3].Interface().([]interface{})
 | 
			
		||||
		}
 | 
			
		||||
		if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok {
 | 
			
		||||
			oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0].Interface().([]interface{})
 | 
			
		||||
		}
 | 
			
		||||
		if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(protoreflect.ProtoMessage); ok {
 | 
			
		||||
			if m, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *protoimpl.MessageInfo }); ok {
 | 
			
		||||
				oneofWrappers = m.ProtoMessageInfo().OneofWrappers
 | 
			
		||||
			}
 | 
			
		||||
			print("\n")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Re-order prop.order.
 | 
			
		||||
	sort.Sort(prop)
 | 
			
		||||
 | 
			
		||||
	var oots []interface{}
 | 
			
		||||
	switch m := reflect.Zero(reflect.PtrTo(t)).Interface().(type) {
 | 
			
		||||
	case oneofFuncsIface:
 | 
			
		||||
		_, _, _, oots = m.XXX_OneofFuncs()
 | 
			
		||||
	case oneofWrappersIface:
 | 
			
		||||
		oots = m.XXX_OneofWrappers()
 | 
			
		||||
	}
 | 
			
		||||
	if len(oots) > 0 {
 | 
			
		||||
		// Interpret oneof metadata.
 | 
			
		||||
		prop.OneofTypes = make(map[string]*OneofProperties)
 | 
			
		||||
		for _, oot := range oots {
 | 
			
		||||
			oop := &OneofProperties{
 | 
			
		||||
				Type: reflect.ValueOf(oot).Type(), // *T
 | 
			
		||||
		for _, wrapper := range oneofWrappers {
 | 
			
		||||
			p := &OneofProperties{
 | 
			
		||||
				Type: reflect.ValueOf(wrapper).Type(), // *T
 | 
			
		||||
				Prop: new(Properties),
 | 
			
		||||
			}
 | 
			
		||||
			sft := oop.Type.Elem().Field(0)
 | 
			
		||||
			oop.Prop.Name = sft.Name
 | 
			
		||||
			oop.Prop.Parse(sft.Tag.Get("protobuf"))
 | 
			
		||||
			// There will be exactly one interface field that
 | 
			
		||||
			// this new value is assignable to.
 | 
			
		||||
			for i := 0; i < t.NumField(); i++ {
 | 
			
		||||
				f := t.Field(i)
 | 
			
		||||
				if f.Type.Kind() != reflect.Interface {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				if !oop.Type.AssignableTo(f.Type) {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				oop.Field = i
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			prop.OneofTypes[oop.Prop.OrigName] = oop
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
			f := p.Type.Elem().Field(0)
 | 
			
		||||
			p.Prop.Name = f.Name
 | 
			
		||||
			p.Prop.Parse(f.Tag.Get("protobuf"))
 | 
			
		||||
 | 
			
		||||
	// build required counts
 | 
			
		||||
	// build tags
 | 
			
		||||
	reqCount := 0
 | 
			
		||||
	prop.decoderOrigNames = make(map[string]int)
 | 
			
		||||
	for i, p := range prop.Prop {
 | 
			
		||||
		if strings.HasPrefix(p.Name, "XXX_") {
 | 
			
		||||
			// Internal fields should not appear in tags/origNames maps.
 | 
			
		||||
			// They are handled specially when encoding and decoding.
 | 
			
		||||
			continue
 | 
			
		||||
			// Determine the struct field that contains this oneof.
 | 
			
		||||
			// Each wrapper is assignable to exactly one parent field.
 | 
			
		||||
			var foundOneof bool
 | 
			
		||||
			for i := 0; i < t.NumField() && !foundOneof; i++ {
 | 
			
		||||
				if p.Type.AssignableTo(t.Field(i).Type) {
 | 
			
		||||
					p.Field = i
 | 
			
		||||
					foundOneof = true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !foundOneof {
 | 
			
		||||
				panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t))
 | 
			
		||||
			}
 | 
			
		||||
			prop.OneofTypes[p.Prop.OrigName] = p
 | 
			
		||||
		}
 | 
			
		||||
		if p.Required {
 | 
			
		||||
			reqCount++
 | 
			
		||||
		}
 | 
			
		||||
		prop.decoderTags.put(p.Tag, i)
 | 
			
		||||
		prop.decoderOrigNames[p.OrigName] = i
 | 
			
		||||
	}
 | 
			
		||||
	prop.reqCount = reqCount
 | 
			
		||||
 | 
			
		||||
	return prop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A global registry of enum types.
 | 
			
		||||
// The generated code will register the generated maps by calling RegisterEnum.
 | 
			
		||||
 | 
			
		||||
var enumValueMaps = make(map[string]map[string]int32)
 | 
			
		||||
 | 
			
		||||
// RegisterEnum is called from the generated code to install the enum descriptor
 | 
			
		||||
// maps into the global table to aid parsing text format protocol buffers.
 | 
			
		||||
func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) {
 | 
			
		||||
	if _, ok := enumValueMaps[typeName]; ok {
 | 
			
		||||
		panic("proto: duplicate enum registered: " + typeName)
 | 
			
		||||
	}
 | 
			
		||||
	enumValueMaps[typeName] = valueMap
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnumValueMap returns the mapping from names to integers of the
 | 
			
		||||
// enum type enumType, or a nil if not found.
 | 
			
		||||
func EnumValueMap(enumType string) map[string]int32 {
 | 
			
		||||
	return enumValueMaps[enumType]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A registry of all linked message types.
 | 
			
		||||
// The string is a fully-qualified proto name ("pkg.Message").
 | 
			
		||||
var (
 | 
			
		||||
	protoTypedNils = make(map[string]Message)      // a map from proto names to typed nil pointers
 | 
			
		||||
	protoMapTypes  = make(map[string]reflect.Type) // a map from proto names to map types
 | 
			
		||||
	revProtoTypes  = make(map[reflect.Type]string)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RegisterType is called from generated code and maps from the fully qualified
 | 
			
		||||
// proto name to the type (pointer to struct) of the protocol buffer.
 | 
			
		||||
func RegisterType(x Message, name string) {
 | 
			
		||||
	if _, ok := protoTypedNils[name]; ok {
 | 
			
		||||
		// TODO: Some day, make this a panic.
 | 
			
		||||
		log.Printf("proto: duplicate proto type registered: %s", name)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t := reflect.TypeOf(x)
 | 
			
		||||
	if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 {
 | 
			
		||||
		// Generated code always calls RegisterType with nil x.
 | 
			
		||||
		// This check is just for extra safety.
 | 
			
		||||
		protoTypedNils[name] = x
 | 
			
		||||
	} else {
 | 
			
		||||
		protoTypedNils[name] = reflect.Zero(t).Interface().(Message)
 | 
			
		||||
	}
 | 
			
		||||
	revProtoTypes[t] = name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterMapType is called from generated code and maps from the fully qualified
 | 
			
		||||
// proto name to the native map type of the proto map definition.
 | 
			
		||||
func RegisterMapType(x interface{}, name string) {
 | 
			
		||||
	if reflect.TypeOf(x).Kind() != reflect.Map {
 | 
			
		||||
		panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name))
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := protoMapTypes[name]; ok {
 | 
			
		||||
		log.Printf("proto: duplicate proto type registered: %s", name)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t := reflect.TypeOf(x)
 | 
			
		||||
	protoMapTypes[name] = t
 | 
			
		||||
	revProtoTypes[t] = name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageName returns the fully-qualified proto name for the given message type.
 | 
			
		||||
func MessageName(x Message) string {
 | 
			
		||||
	type xname interface {
 | 
			
		||||
		XXX_MessageName() string
 | 
			
		||||
	}
 | 
			
		||||
	if m, ok := x.(xname); ok {
 | 
			
		||||
		return m.XXX_MessageName()
 | 
			
		||||
	}
 | 
			
		||||
	return revProtoTypes[reflect.TypeOf(x)]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageType returns the message type (pointer to struct) for a named message.
 | 
			
		||||
// The type is not guaranteed to implement proto.Message if the name refers to a
 | 
			
		||||
// map entry.
 | 
			
		||||
func MessageType(name string) reflect.Type {
 | 
			
		||||
	if t, ok := protoTypedNils[name]; ok {
 | 
			
		||||
		return reflect.TypeOf(t)
 | 
			
		||||
	}
 | 
			
		||||
	return protoMapTypes[name]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A registry of all linked proto files.
 | 
			
		||||
var (
 | 
			
		||||
	protoFiles = make(map[string][]byte) // file name => fileDescriptor
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RegisterFile is called from generated code and maps from the
 | 
			
		||||
// full file name of a .proto file to its compressed FileDescriptorProto.
 | 
			
		||||
func RegisterFile(filename string, fileDescriptor []byte) {
 | 
			
		||||
	protoFiles[filename] = fileDescriptor
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FileDescriptor returns the compressed FileDescriptorProto for a .proto file.
 | 
			
		||||
func FileDescriptor(filename string) []byte { return protoFiles[filename] }
 | 
			
		||||
func (sp *StructProperties) Len() int           { return len(sp.Prop) }
 | 
			
		||||
func (sp *StructProperties) Less(i, j int) bool { return false }
 | 
			
		||||
func (sp *StructProperties) Swap(i, j int)      { return }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										167
									
								
								vendor/github.com/golang/protobuf/proto/proto.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								vendor/github.com/golang/protobuf/proto/proto.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,167 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package proto provides functionality for handling protocol buffer messages.
 | 
			
		||||
// In particular, it provides marshaling and unmarshaling between a protobuf
 | 
			
		||||
// message and the binary wire format.
 | 
			
		||||
//
 | 
			
		||||
// See https://developers.google.com/protocol-buffers/docs/gotutorial for
 | 
			
		||||
// more information.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use the "google.golang.org/protobuf/proto" package instead.
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	ProtoPackageIsVersion1 = true
 | 
			
		||||
	ProtoPackageIsVersion2 = true
 | 
			
		||||
	ProtoPackageIsVersion3 = true
 | 
			
		||||
	ProtoPackageIsVersion4 = true
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GeneratedEnum is any enum type generated by protoc-gen-go
 | 
			
		||||
// which is a named int32 kind.
 | 
			
		||||
// This type exists for documentation purposes.
 | 
			
		||||
type GeneratedEnum interface{}
 | 
			
		||||
 | 
			
		||||
// GeneratedMessage is any message type generated by protoc-gen-go
 | 
			
		||||
// which is a pointer to a named struct kind.
 | 
			
		||||
// This type exists for documentation purposes.
 | 
			
		||||
type GeneratedMessage interface{}
 | 
			
		||||
 | 
			
		||||
// Message is a protocol buffer message.
 | 
			
		||||
//
 | 
			
		||||
// This is the v1 version of the message interface and is marginally better
 | 
			
		||||
// than an empty interface as it lacks any method to programatically interact
 | 
			
		||||
// with the contents of the message.
 | 
			
		||||
//
 | 
			
		||||
// A v2 message is declared in "google.golang.org/protobuf/proto".Message and
 | 
			
		||||
// exposes protobuf reflection as a first-class feature of the interface.
 | 
			
		||||
//
 | 
			
		||||
// To convert a v1 message to a v2 message, use the MessageV2 function.
 | 
			
		||||
// To convert a v2 message to a v1 message, use the MessageV1 function.
 | 
			
		||||
type Message = protoiface.MessageV1
 | 
			
		||||
 | 
			
		||||
// MessageV1 converts either a v1 or v2 message to a v1 message.
 | 
			
		||||
// It returns nil if m is nil.
 | 
			
		||||
func MessageV1(m GeneratedMessage) protoiface.MessageV1 {
 | 
			
		||||
	return protoimpl.X.ProtoMessageV1Of(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageV2 converts either a v1 or v2 message to a v2 message.
 | 
			
		||||
// It returns nil if m is nil.
 | 
			
		||||
func MessageV2(m GeneratedMessage) protoV2.Message {
 | 
			
		||||
	return protoimpl.X.ProtoMessageV2Of(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageReflect returns a reflective view for a message.
 | 
			
		||||
// It returns nil if m is nil.
 | 
			
		||||
func MessageReflect(m Message) protoreflect.Message {
 | 
			
		||||
	return protoimpl.X.MessageOf(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshaler is implemented by messages that can marshal themselves.
 | 
			
		||||
// This interface is used by the following functions: Size, Marshal,
 | 
			
		||||
// Buffer.Marshal, and Buffer.EncodeMessage.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not implement.
 | 
			
		||||
type Marshaler interface {
 | 
			
		||||
	// Marshal formats the encoded bytes of the message.
 | 
			
		||||
	// It should be deterministic and emit valid protobuf wire data.
 | 
			
		||||
	// The caller takes ownership of the returned buffer.
 | 
			
		||||
	Marshal() ([]byte, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshaler is implemented by messages that can unmarshal themselves.
 | 
			
		||||
// This interface is used by the following functions: Unmarshal, UnmarshalMerge,
 | 
			
		||||
// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not implement.
 | 
			
		||||
type Unmarshaler interface {
 | 
			
		||||
	// Unmarshal parses the encoded bytes of the protobuf wire input.
 | 
			
		||||
	// The provided buffer is only valid for during method call.
 | 
			
		||||
	// It should not reset the receiver message.
 | 
			
		||||
	Unmarshal([]byte) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merger is implemented by messages that can merge themselves.
 | 
			
		||||
// This interface is used by the following functions: Clone and Merge.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not implement.
 | 
			
		||||
type Merger interface {
 | 
			
		||||
	// Merge merges the contents of src into the receiver message.
 | 
			
		||||
	// It clones all data structures in src such that it aliases no mutable
 | 
			
		||||
	// memory referenced by src.
 | 
			
		||||
	Merge(src Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RequiredNotSetError is an error type returned when
 | 
			
		||||
// marshaling or unmarshaling a message with missing required fields.
 | 
			
		||||
type RequiredNotSetError struct {
 | 
			
		||||
	err error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *RequiredNotSetError) Error() string {
 | 
			
		||||
	if e.err != nil {
 | 
			
		||||
		return e.err.Error()
 | 
			
		||||
	}
 | 
			
		||||
	return "proto: required field not set"
 | 
			
		||||
}
 | 
			
		||||
func (e *RequiredNotSetError) RequiredNotSet() bool {
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkRequiredNotSet(m protoV2.Message) error {
 | 
			
		||||
	if err := protoV2.CheckInitialized(m); err != nil {
 | 
			
		||||
		return &RequiredNotSetError{err: err}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clone returns a deep copy of src.
 | 
			
		||||
func Clone(src Message) Message {
 | 
			
		||||
	return MessageV1(protoV2.Clone(MessageV2(src)))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merge merges src into dst, which must be messages of the same type.
 | 
			
		||||
//
 | 
			
		||||
// Populated scalar fields in src are copied to dst, while populated
 | 
			
		||||
// singular messages in src are merged into dst by recursively calling Merge.
 | 
			
		||||
// The elements of every list field in src is appended to the corresponded
 | 
			
		||||
// list fields in dst. The entries of every map field in src is copied into
 | 
			
		||||
// the corresponding map field in dst, possibly replacing existing entries.
 | 
			
		||||
// The unknown fields of src are appended to the unknown fields of dst.
 | 
			
		||||
func Merge(dst, src Message) {
 | 
			
		||||
	protoV2.Merge(MessageV2(dst), MessageV2(src))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Equal reports whether two messages are equal.
 | 
			
		||||
// If two messages marshal to the same bytes under deterministic serialization,
 | 
			
		||||
// then Equal is guaranteed to report true.
 | 
			
		||||
//
 | 
			
		||||
// Two messages are equal if they are the same protobuf message type,
 | 
			
		||||
// have the same set of populated known and extension field values,
 | 
			
		||||
// and the same set of unknown fields values.
 | 
			
		||||
//
 | 
			
		||||
// Scalar values are compared with the equivalent of the == operator in Go,
 | 
			
		||||
// except bytes values which are compared using bytes.Equal and
 | 
			
		||||
// floating point values which specially treat NaNs as equal.
 | 
			
		||||
// Message values are compared by recursively calling Equal.
 | 
			
		||||
// Lists are equal if each element value is also equal.
 | 
			
		||||
// Maps are equal if they have the same set of keys, where the pair of values
 | 
			
		||||
// for each key is also equal.
 | 
			
		||||
func Equal(x, y Message) bool {
 | 
			
		||||
	return protoV2.Equal(MessageV2(x), MessageV2(y))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isMessageSet(md protoreflect.MessageDescriptor) bool {
 | 
			
		||||
	ms, ok := md.(interface{ IsMessageSet() bool })
 | 
			
		||||
	return ok && ms.IsMessageSet()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										323
									
								
								vendor/github.com/golang/protobuf/proto/registry.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								vendor/github.com/golang/protobuf/proto/registry.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,323 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"compress/gzip"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// filePath is the path to the proto source file.
 | 
			
		||||
type filePath = string // e.g., "google/protobuf/descriptor.proto"
 | 
			
		||||
 | 
			
		||||
// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto.
 | 
			
		||||
type fileDescGZIP = []byte
 | 
			
		||||
 | 
			
		||||
var fileCache sync.Map // map[filePath]fileDescGZIP
 | 
			
		||||
 | 
			
		||||
// RegisterFile is called from generated code to register the compressed
 | 
			
		||||
// FileDescriptorProto with the file path for a proto source file.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead.
 | 
			
		||||
func RegisterFile(s filePath, d fileDescGZIP) {
 | 
			
		||||
	// Decompress the descriptor.
 | 
			
		||||
	zr, err := gzip.NewReader(bytes.NewReader(d))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
 | 
			
		||||
	}
 | 
			
		||||
	b, err := ioutil.ReadAll(zr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Construct a protoreflect.FileDescriptor from the raw descriptor.
 | 
			
		||||
	// Note that DescBuilder.Build automatically registers the constructed
 | 
			
		||||
	// file descriptor with the v2 registry.
 | 
			
		||||
	protoimpl.DescBuilder{RawDescriptor: b}.Build()
 | 
			
		||||
 | 
			
		||||
	// Locally cache the raw descriptor form for the file.
 | 
			
		||||
	fileCache.Store(s, d)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FileDescriptor returns the compressed FileDescriptorProto given the file path
 | 
			
		||||
// for a proto source file. It returns nil if not found.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead.
 | 
			
		||||
func FileDescriptor(s filePath) fileDescGZIP {
 | 
			
		||||
	if v, ok := fileCache.Load(s); ok {
 | 
			
		||||
		return v.(fileDescGZIP)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Find the descriptor in the v2 registry.
 | 
			
		||||
	var b []byte
 | 
			
		||||
	if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil {
 | 
			
		||||
		if fd, ok := fd.(interface{ ProtoLegacyRawDesc() []byte }); ok {
 | 
			
		||||
			b = fd.ProtoLegacyRawDesc()
 | 
			
		||||
		} else {
 | 
			
		||||
			// TODO: Use protodesc.ToFileDescriptorProto to construct
 | 
			
		||||
			// a descriptorpb.FileDescriptorProto and marshal it.
 | 
			
		||||
			// However, doing so causes the proto package to have a dependency
 | 
			
		||||
			// on descriptorpb, leading to cyclic dependency issues.
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Locally cache the raw descriptor form for the file.
 | 
			
		||||
	if len(b) > 0 {
 | 
			
		||||
		v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b))
 | 
			
		||||
		return v.(fileDescGZIP)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// enumName is the name of an enum. For historical reasons, the enum name is
 | 
			
		||||
// neither the full Go name nor the full protobuf name of the enum.
 | 
			
		||||
// The name is the dot-separated combination of just the proto package that the
 | 
			
		||||
// enum is declared within followed by the Go type name of the generated enum.
 | 
			
		||||
type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum"
 | 
			
		||||
 | 
			
		||||
// enumsByName maps enum values by name to their numeric counterpart.
 | 
			
		||||
type enumsByName = map[string]int32
 | 
			
		||||
 | 
			
		||||
// enumsByNumber maps enum values by number to their name counterpart.
 | 
			
		||||
type enumsByNumber = map[int32]string
 | 
			
		||||
 | 
			
		||||
var enumCache sync.Map     // map[enumName]enumsByName
 | 
			
		||||
var numFilesCache sync.Map // map[protoreflect.FullName]int
 | 
			
		||||
 | 
			
		||||
// RegisterEnum is called from the generated code to register the mapping of
 | 
			
		||||
// enum value names to enum numbers for the enum identified by s.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead.
 | 
			
		||||
func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) {
 | 
			
		||||
	if _, ok := enumCache.Load(s); ok {
 | 
			
		||||
		panic("proto: duplicate enum registered: " + s)
 | 
			
		||||
	}
 | 
			
		||||
	enumCache.Store(s, m)
 | 
			
		||||
 | 
			
		||||
	// This does not forward registration to the v2 registry since this API
 | 
			
		||||
	// lacks sufficient information to construct a complete v2 enum descriptor.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EnumValueMap returns the mapping from enum value names to enum numbers for
 | 
			
		||||
// the enum of the given name. It returns nil if not found.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead.
 | 
			
		||||
func EnumValueMap(s enumName) enumsByName {
 | 
			
		||||
	if v, ok := enumCache.Load(s); ok {
 | 
			
		||||
		return v.(enumsByName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check whether the cache is stale. If the number of files in the current
 | 
			
		||||
	// package differs, then it means that some enums may have been recently
 | 
			
		||||
	// registered upstream that we do not know about.
 | 
			
		||||
	var protoPkg protoreflect.FullName
 | 
			
		||||
	if i := strings.LastIndexByte(s, '.'); i >= 0 {
 | 
			
		||||
		protoPkg = protoreflect.FullName(s[:i])
 | 
			
		||||
	}
 | 
			
		||||
	v, _ := numFilesCache.Load(protoPkg)
 | 
			
		||||
	numFiles, _ := v.(int)
 | 
			
		||||
	if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles {
 | 
			
		||||
		return nil // cache is up-to-date; was not found earlier
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Update the enum cache for all enums declared in the given proto package.
 | 
			
		||||
	numFiles = 0
 | 
			
		||||
	protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool {
 | 
			
		||||
		walkEnums(fd, func(ed protoreflect.EnumDescriptor) {
 | 
			
		||||
			name := protoimpl.X.LegacyEnumName(ed)
 | 
			
		||||
			if _, ok := enumCache.Load(name); !ok {
 | 
			
		||||
				m := make(enumsByName)
 | 
			
		||||
				evs := ed.Values()
 | 
			
		||||
				for i := evs.Len() - 1; i >= 0; i-- {
 | 
			
		||||
					ev := evs.Get(i)
 | 
			
		||||
					m[string(ev.Name())] = int32(ev.Number())
 | 
			
		||||
				}
 | 
			
		||||
				enumCache.LoadOrStore(name, m)
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
		numFiles++
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
	numFilesCache.Store(protoPkg, numFiles)
 | 
			
		||||
 | 
			
		||||
	// Check cache again for enum map.
 | 
			
		||||
	if v, ok := enumCache.Load(s); ok {
 | 
			
		||||
		return v.(enumsByName)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// walkEnums recursively walks all enums declared in d.
 | 
			
		||||
func walkEnums(d interface {
 | 
			
		||||
	Enums() protoreflect.EnumDescriptors
 | 
			
		||||
	Messages() protoreflect.MessageDescriptors
 | 
			
		||||
}, f func(protoreflect.EnumDescriptor)) {
 | 
			
		||||
	eds := d.Enums()
 | 
			
		||||
	for i := eds.Len() - 1; i >= 0; i-- {
 | 
			
		||||
		f(eds.Get(i))
 | 
			
		||||
	}
 | 
			
		||||
	mds := d.Messages()
 | 
			
		||||
	for i := mds.Len() - 1; i >= 0; i-- {
 | 
			
		||||
		walkEnums(mds.Get(i), f)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// messageName is the full name of protobuf message.
 | 
			
		||||
type messageName = string
 | 
			
		||||
 | 
			
		||||
var messageTypeCache sync.Map // map[messageName]reflect.Type
 | 
			
		||||
 | 
			
		||||
// RegisterType is called from generated code to register the message Go type
 | 
			
		||||
// for a message of the given name.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead.
 | 
			
		||||
func RegisterType(m Message, s messageName) {
 | 
			
		||||
	mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s))
 | 
			
		||||
	if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	messageTypeCache.Store(s, reflect.TypeOf(m))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterMapType is called from generated code to register the Go map type
 | 
			
		||||
// for a protobuf message representing a map entry.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Do not use.
 | 
			
		||||
func RegisterMapType(m interface{}, s messageName) {
 | 
			
		||||
	t := reflect.TypeOf(m)
 | 
			
		||||
	if t.Kind() != reflect.Map {
 | 
			
		||||
		panic(fmt.Sprintf("invalid map kind: %v", t))
 | 
			
		||||
	}
 | 
			
		||||
	if _, ok := messageTypeCache.Load(s); ok {
 | 
			
		||||
		panic(fmt.Errorf("proto: duplicate proto message registered: %s", s))
 | 
			
		||||
	}
 | 
			
		||||
	messageTypeCache.Store(s, t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageType returns the message type for a named message.
 | 
			
		||||
// It returns nil if not found.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead.
 | 
			
		||||
func MessageType(s messageName) reflect.Type {
 | 
			
		||||
	if v, ok := messageTypeCache.Load(s); ok {
 | 
			
		||||
		return v.(reflect.Type)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Derive the message type from the v2 registry.
 | 
			
		||||
	var t reflect.Type
 | 
			
		||||
	if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil {
 | 
			
		||||
		t = messageGoType(mt)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If we could not get a concrete type, it is possible that it is a
 | 
			
		||||
	// pseudo-message for a map entry.
 | 
			
		||||
	if t == nil {
 | 
			
		||||
		d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s))
 | 
			
		||||
		if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() {
 | 
			
		||||
			kt := goTypeForField(md.Fields().ByNumber(1))
 | 
			
		||||
			vt := goTypeForField(md.Fields().ByNumber(2))
 | 
			
		||||
			t = reflect.MapOf(kt, vt)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Locally cache the message type for the given name.
 | 
			
		||||
	if t != nil {
 | 
			
		||||
		v, _ := messageTypeCache.LoadOrStore(s, t)
 | 
			
		||||
		return v.(reflect.Type)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type {
 | 
			
		||||
	switch k := fd.Kind(); k {
 | 
			
		||||
	case protoreflect.EnumKind:
 | 
			
		||||
		if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil {
 | 
			
		||||
			return enumGoType(et)
 | 
			
		||||
		}
 | 
			
		||||
		return reflect.TypeOf(protoreflect.EnumNumber(0))
 | 
			
		||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
			
		||||
		if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil {
 | 
			
		||||
			return messageGoType(mt)
 | 
			
		||||
		}
 | 
			
		||||
		return reflect.TypeOf((*protoreflect.Message)(nil)).Elem()
 | 
			
		||||
	default:
 | 
			
		||||
		return reflect.TypeOf(fd.Default().Interface())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func enumGoType(et protoreflect.EnumType) reflect.Type {
 | 
			
		||||
	return reflect.TypeOf(et.New(0))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func messageGoType(mt protoreflect.MessageType) reflect.Type {
 | 
			
		||||
	return reflect.TypeOf(MessageV1(mt.Zero().Interface()))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MessageName returns the full protobuf name for the given message type.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoreflect.MessageDescriptor.FullName instead.
 | 
			
		||||
func MessageName(m Message) messageName {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	if m, ok := m.(interface{ XXX_MessageName() messageName }); ok {
 | 
			
		||||
		return m.XXX_MessageName()
 | 
			
		||||
	}
 | 
			
		||||
	return messageName(protoimpl.X.MessageDescriptorOf(m).FullName())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterExtension is called from the generated code to register
 | 
			
		||||
// the extension descriptor.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead.
 | 
			
		||||
func RegisterExtension(d *ExtensionDesc) {
 | 
			
		||||
	if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type extensionsByNumber = map[int32]*ExtensionDesc
 | 
			
		||||
 | 
			
		||||
var extensionCache sync.Map // map[messageName]extensionsByNumber
 | 
			
		||||
 | 
			
		||||
// RegisteredExtensions returns a map of the registered extensions for the
 | 
			
		||||
// provided protobuf message, indexed by the extension field number.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead.
 | 
			
		||||
func RegisteredExtensions(m Message) extensionsByNumber {
 | 
			
		||||
	// Check whether the cache is stale. If the number of extensions for
 | 
			
		||||
	// the given message differs, then it means that some extensions were
 | 
			
		||||
	// recently registered upstream that we do not know about.
 | 
			
		||||
	s := MessageName(m)
 | 
			
		||||
	v, _ := extensionCache.Load(s)
 | 
			
		||||
	xs, _ := v.(extensionsByNumber)
 | 
			
		||||
	if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) {
 | 
			
		||||
		return xs // cache is up-to-date
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Cache is stale, re-compute the extensions map.
 | 
			
		||||
	xs = make(extensionsByNumber)
 | 
			
		||||
	protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool {
 | 
			
		||||
		if xd, ok := xt.(*ExtensionDesc); ok {
 | 
			
		||||
			xs[int32(xt.TypeDescriptor().Number())] = xd
 | 
			
		||||
		} else {
 | 
			
		||||
			// TODO: This implies that the protoreflect.ExtensionType is a
 | 
			
		||||
			// custom type not generated by protoc-gen-go. We could try and
 | 
			
		||||
			// convert the type to an ExtensionDesc.
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
	extensionCache.Store(s, xs)
 | 
			
		||||
	return xs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2776
									
								
								vendor/github.com/golang/protobuf/proto/table_marshal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2776
									
								
								vendor/github.com/golang/protobuf/proto/table_marshal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										654
									
								
								vendor/github.com/golang/protobuf/proto/table_merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										654
									
								
								vendor/github.com/golang/protobuf/proto/table_merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,654 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Merge merges the src message into dst.
 | 
			
		||||
// This assumes that dst and src of the same type and are non-nil.
 | 
			
		||||
func (a *InternalMessageInfo) Merge(dst, src Message) {
 | 
			
		||||
	mi := atomicLoadMergeInfo(&a.merge)
 | 
			
		||||
	if mi == nil {
 | 
			
		||||
		mi = getMergeInfo(reflect.TypeOf(dst).Elem())
 | 
			
		||||
		atomicStoreMergeInfo(&a.merge, mi)
 | 
			
		||||
	}
 | 
			
		||||
	mi.merge(toPointer(&dst), toPointer(&src))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type mergeInfo struct {
 | 
			
		||||
	typ reflect.Type
 | 
			
		||||
 | 
			
		||||
	initialized int32 // 0: only typ is valid, 1: everything is valid
 | 
			
		||||
	lock        sync.Mutex
 | 
			
		||||
 | 
			
		||||
	fields       []mergeFieldInfo
 | 
			
		||||
	unrecognized field // Offset of XXX_unrecognized
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type mergeFieldInfo struct {
 | 
			
		||||
	field field // Offset of field, guaranteed to be valid
 | 
			
		||||
 | 
			
		||||
	// isPointer reports whether the value in the field is a pointer.
 | 
			
		||||
	// This is true for the following situations:
 | 
			
		||||
	//	* Pointer to struct
 | 
			
		||||
	//	* Pointer to basic type (proto2 only)
 | 
			
		||||
	//	* Slice (first value in slice header is a pointer)
 | 
			
		||||
	//	* String (first value in string header is a pointer)
 | 
			
		||||
	isPointer bool
 | 
			
		||||
 | 
			
		||||
	// basicWidth reports the width of the field assuming that it is directly
 | 
			
		||||
	// embedded in the struct (as is the case for basic types in proto3).
 | 
			
		||||
	// The possible values are:
 | 
			
		||||
	// 	0: invalid
 | 
			
		||||
	//	1: bool
 | 
			
		||||
	//	4: int32, uint32, float32
 | 
			
		||||
	//	8: int64, uint64, float64
 | 
			
		||||
	basicWidth int
 | 
			
		||||
 | 
			
		||||
	// Where dst and src are pointers to the types being merged.
 | 
			
		||||
	merge func(dst, src pointer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	mergeInfoMap  = map[reflect.Type]*mergeInfo{}
 | 
			
		||||
	mergeInfoLock sync.Mutex
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func getMergeInfo(t reflect.Type) *mergeInfo {
 | 
			
		||||
	mergeInfoLock.Lock()
 | 
			
		||||
	defer mergeInfoLock.Unlock()
 | 
			
		||||
	mi := mergeInfoMap[t]
 | 
			
		||||
	if mi == nil {
 | 
			
		||||
		mi = &mergeInfo{typ: t}
 | 
			
		||||
		mergeInfoMap[t] = mi
 | 
			
		||||
	}
 | 
			
		||||
	return mi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// merge merges src into dst assuming they are both of type *mi.typ.
 | 
			
		||||
func (mi *mergeInfo) merge(dst, src pointer) {
 | 
			
		||||
	if dst.isNil() {
 | 
			
		||||
		panic("proto: nil destination")
 | 
			
		||||
	}
 | 
			
		||||
	if src.isNil() {
 | 
			
		||||
		return // Nothing to do.
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if atomic.LoadInt32(&mi.initialized) == 0 {
 | 
			
		||||
		mi.computeMergeInfo()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, fi := range mi.fields {
 | 
			
		||||
		sfp := src.offset(fi.field)
 | 
			
		||||
 | 
			
		||||
		// As an optimization, we can avoid the merge function call cost
 | 
			
		||||
		// if we know for sure that the source will have no effect
 | 
			
		||||
		// by checking if it is the zero value.
 | 
			
		||||
		if unsafeAllowed {
 | 
			
		||||
			if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if fi.basicWidth > 0 {
 | 
			
		||||
				switch {
 | 
			
		||||
				case fi.basicWidth == 1 && !*sfp.toBool():
 | 
			
		||||
					continue
 | 
			
		||||
				case fi.basicWidth == 4 && *sfp.toUint32() == 0:
 | 
			
		||||
					continue
 | 
			
		||||
				case fi.basicWidth == 8 && *sfp.toUint64() == 0:
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dfp := dst.offset(fi.field)
 | 
			
		||||
		fi.merge(dfp, sfp)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO: Make this faster?
 | 
			
		||||
	out := dst.asPointerTo(mi.typ).Elem()
 | 
			
		||||
	in := src.asPointerTo(mi.typ).Elem()
 | 
			
		||||
	if emIn, err := extendable(in.Addr().Interface()); err == nil {
 | 
			
		||||
		emOut, _ := extendable(out.Addr().Interface())
 | 
			
		||||
		mIn, muIn := emIn.extensionsRead()
 | 
			
		||||
		if mIn != nil {
 | 
			
		||||
			mOut := emOut.extensionsWrite()
 | 
			
		||||
			muIn.Lock()
 | 
			
		||||
			mergeExtension(mOut, mIn)
 | 
			
		||||
			muIn.Unlock()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if mi.unrecognized.IsValid() {
 | 
			
		||||
		if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 {
 | 
			
		||||
			*dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (mi *mergeInfo) computeMergeInfo() {
 | 
			
		||||
	mi.lock.Lock()
 | 
			
		||||
	defer mi.lock.Unlock()
 | 
			
		||||
	if mi.initialized != 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t := mi.typ
 | 
			
		||||
	n := t.NumField()
 | 
			
		||||
 | 
			
		||||
	props := GetProperties(t)
 | 
			
		||||
	for i := 0; i < n; i++ {
 | 
			
		||||
		f := t.Field(i)
 | 
			
		||||
		if strings.HasPrefix(f.Name, "XXX_") {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mfi := mergeFieldInfo{field: toField(&f)}
 | 
			
		||||
		tf := f.Type
 | 
			
		||||
 | 
			
		||||
		// As an optimization, we can avoid the merge function call cost
 | 
			
		||||
		// if we know for sure that the source will have no effect
 | 
			
		||||
		// by checking if it is the zero value.
 | 
			
		||||
		if unsafeAllowed {
 | 
			
		||||
			switch tf.Kind() {
 | 
			
		||||
			case reflect.Ptr, reflect.Slice, reflect.String:
 | 
			
		||||
				// As a special case, we assume slices and strings are pointers
 | 
			
		||||
				// since we know that the first field in the SliceSlice or
 | 
			
		||||
				// StringHeader is a data pointer.
 | 
			
		||||
				mfi.isPointer = true
 | 
			
		||||
			case reflect.Bool:
 | 
			
		||||
				mfi.basicWidth = 1
 | 
			
		||||
			case reflect.Int32, reflect.Uint32, reflect.Float32:
 | 
			
		||||
				mfi.basicWidth = 4
 | 
			
		||||
			case reflect.Int64, reflect.Uint64, reflect.Float64:
 | 
			
		||||
				mfi.basicWidth = 8
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Unwrap tf to get at its most basic type.
 | 
			
		||||
		var isPointer, isSlice bool
 | 
			
		||||
		if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 {
 | 
			
		||||
			isSlice = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if tf.Kind() == reflect.Ptr {
 | 
			
		||||
			isPointer = true
 | 
			
		||||
			tf = tf.Elem()
 | 
			
		||||
		}
 | 
			
		||||
		if isPointer && isSlice && tf.Kind() != reflect.Struct {
 | 
			
		||||
			panic("both pointer and slice for basic type in " + tf.Name())
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch tf.Kind() {
 | 
			
		||||
		case reflect.Int32:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []int32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					// NOTE: toInt32Slice is not defined (see pointer_reflect.go).
 | 
			
		||||
					/*
 | 
			
		||||
						sfsp := src.toInt32Slice()
 | 
			
		||||
						if *sfsp != nil {
 | 
			
		||||
							dfsp := dst.toInt32Slice()
 | 
			
		||||
							*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
							if *dfsp == nil {
 | 
			
		||||
								*dfsp = []int64{}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					*/
 | 
			
		||||
					sfs := src.getInt32Slice()
 | 
			
		||||
					if sfs != nil {
 | 
			
		||||
						dfs := dst.getInt32Slice()
 | 
			
		||||
						dfs = append(dfs, sfs...)
 | 
			
		||||
						if dfs == nil {
 | 
			
		||||
							dfs = []int32{}
 | 
			
		||||
						}
 | 
			
		||||
						dst.setInt32Slice(dfs)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *int32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					// NOTE: toInt32Ptr is not defined (see pointer_reflect.go).
 | 
			
		||||
					/*
 | 
			
		||||
						sfpp := src.toInt32Ptr()
 | 
			
		||||
						if *sfpp != nil {
 | 
			
		||||
							dfpp := dst.toInt32Ptr()
 | 
			
		||||
							if *dfpp == nil {
 | 
			
		||||
								*dfpp = Int32(**sfpp)
 | 
			
		||||
							} else {
 | 
			
		||||
								**dfpp = **sfpp
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					*/
 | 
			
		||||
					sfp := src.getInt32Ptr()
 | 
			
		||||
					if sfp != nil {
 | 
			
		||||
						dfp := dst.getInt32Ptr()
 | 
			
		||||
						if dfp == nil {
 | 
			
		||||
							dst.setInt32Ptr(*sfp)
 | 
			
		||||
						} else {
 | 
			
		||||
							*dfp = *sfp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., int32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toInt32(); v != 0 {
 | 
			
		||||
						*dst.toInt32() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Int64:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []int64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toInt64Slice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toInt64Slice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []int64{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *int64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toInt64Ptr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toInt64Ptr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Int64(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., int64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toInt64(); v != 0 {
 | 
			
		||||
						*dst.toInt64() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Uint32:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []uint32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toUint32Slice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toUint32Slice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []uint32{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *uint32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toUint32Ptr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toUint32Ptr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Uint32(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., uint32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toUint32(); v != 0 {
 | 
			
		||||
						*dst.toUint32() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Uint64:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []uint64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toUint64Slice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toUint64Slice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []uint64{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *uint64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toUint64Ptr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toUint64Ptr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Uint64(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., uint64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toUint64(); v != 0 {
 | 
			
		||||
						*dst.toUint64() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Float32:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []float32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toFloat32Slice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toFloat32Slice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []float32{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *float32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toFloat32Ptr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toFloat32Ptr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Float32(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., float32
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toFloat32(); v != 0 {
 | 
			
		||||
						*dst.toFloat32() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Float64:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []float64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toFloat64Slice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toFloat64Slice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []float64{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *float64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toFloat64Ptr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toFloat64Ptr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Float64(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., float64
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toFloat64(); v != 0 {
 | 
			
		||||
						*dst.toFloat64() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Bool:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []bool
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toBoolSlice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toBoolSlice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []bool{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *bool
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toBoolPtr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toBoolPtr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = Bool(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., bool
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toBool(); v {
 | 
			
		||||
						*dst.toBool() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.String:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isSlice: // E.g., []string
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfsp := src.toStringSlice()
 | 
			
		||||
					if *sfsp != nil {
 | 
			
		||||
						dfsp := dst.toStringSlice()
 | 
			
		||||
						*dfsp = append(*dfsp, *sfsp...)
 | 
			
		||||
						if *dfsp == nil {
 | 
			
		||||
							*dfsp = []string{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			case isPointer: // E.g., *string
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sfpp := src.toStringPtr()
 | 
			
		||||
					if *sfpp != nil {
 | 
			
		||||
						dfpp := dst.toStringPtr()
 | 
			
		||||
						if *dfpp == nil {
 | 
			
		||||
							*dfpp = String(**sfpp)
 | 
			
		||||
						} else {
 | 
			
		||||
							**dfpp = **sfpp
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., string
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					if v := *src.toString(); v != "" {
 | 
			
		||||
						*dst.toString() = v
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Slice:
 | 
			
		||||
			isProto3 := props.Prop[i].proto3
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer:
 | 
			
		||||
				panic("bad pointer in byte slice case in " + tf.Name())
 | 
			
		||||
			case tf.Elem().Kind() != reflect.Uint8:
 | 
			
		||||
				panic("bad element kind in byte slice case in " + tf.Name())
 | 
			
		||||
			case isSlice: // E.g., [][]byte
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sbsp := src.toBytesSlice()
 | 
			
		||||
					if *sbsp != nil {
 | 
			
		||||
						dbsp := dst.toBytesSlice()
 | 
			
		||||
						for _, sb := range *sbsp {
 | 
			
		||||
							if sb == nil {
 | 
			
		||||
								*dbsp = append(*dbsp, nil)
 | 
			
		||||
							} else {
 | 
			
		||||
								*dbsp = append(*dbsp, append([]byte{}, sb...))
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						if *dbsp == nil {
 | 
			
		||||
							*dbsp = [][]byte{}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., []byte
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sbp := src.toBytes()
 | 
			
		||||
					if *sbp != nil {
 | 
			
		||||
						dbp := dst.toBytes()
 | 
			
		||||
						if !isProto3 || len(*sbp) > 0 {
 | 
			
		||||
							*dbp = append([]byte{}, *sbp...)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Struct:
 | 
			
		||||
			switch {
 | 
			
		||||
			case !isPointer:
 | 
			
		||||
				panic(fmt.Sprintf("message field %s without pointer", tf))
 | 
			
		||||
			case isSlice: // E.g., []*pb.T
 | 
			
		||||
				mi := getMergeInfo(tf)
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sps := src.getPointerSlice()
 | 
			
		||||
					if sps != nil {
 | 
			
		||||
						dps := dst.getPointerSlice()
 | 
			
		||||
						for _, sp := range sps {
 | 
			
		||||
							var dp pointer
 | 
			
		||||
							if !sp.isNil() {
 | 
			
		||||
								dp = valToPointer(reflect.New(tf))
 | 
			
		||||
								mi.merge(dp, sp)
 | 
			
		||||
							}
 | 
			
		||||
							dps = append(dps, dp)
 | 
			
		||||
						}
 | 
			
		||||
						if dps == nil {
 | 
			
		||||
							dps = []pointer{}
 | 
			
		||||
						}
 | 
			
		||||
						dst.setPointerSlice(dps)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			default: // E.g., *pb.T
 | 
			
		||||
				mi := getMergeInfo(tf)
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sp := src.getPointer()
 | 
			
		||||
					if !sp.isNil() {
 | 
			
		||||
						dp := dst.getPointer()
 | 
			
		||||
						if dp.isNil() {
 | 
			
		||||
							dp = valToPointer(reflect.New(tf))
 | 
			
		||||
							dst.setPointer(dp)
 | 
			
		||||
						}
 | 
			
		||||
						mi.merge(dp, sp)
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Map:
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic("bad pointer or slice in map case in " + tf.Name())
 | 
			
		||||
			default: // E.g., map[K]V
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					sm := src.asPointerTo(tf).Elem()
 | 
			
		||||
					if sm.Len() == 0 {
 | 
			
		||||
						return
 | 
			
		||||
					}
 | 
			
		||||
					dm := dst.asPointerTo(tf).Elem()
 | 
			
		||||
					if dm.IsNil() {
 | 
			
		||||
						dm.Set(reflect.MakeMap(tf))
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					switch tf.Elem().Kind() {
 | 
			
		||||
					case reflect.Ptr: // Proto struct (e.g., *T)
 | 
			
		||||
						for _, key := range sm.MapKeys() {
 | 
			
		||||
							val := sm.MapIndex(key)
 | 
			
		||||
							val = reflect.ValueOf(Clone(val.Interface().(Message)))
 | 
			
		||||
							dm.SetMapIndex(key, val)
 | 
			
		||||
						}
 | 
			
		||||
					case reflect.Slice: // E.g. Bytes type (e.g., []byte)
 | 
			
		||||
						for _, key := range sm.MapKeys() {
 | 
			
		||||
							val := sm.MapIndex(key)
 | 
			
		||||
							val = reflect.ValueOf(append([]byte{}, val.Bytes()...))
 | 
			
		||||
							dm.SetMapIndex(key, val)
 | 
			
		||||
						}
 | 
			
		||||
					default: // Basic type (e.g., string)
 | 
			
		||||
						for _, key := range sm.MapKeys() {
 | 
			
		||||
							val := sm.MapIndex(key)
 | 
			
		||||
							dm.SetMapIndex(key, val)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case reflect.Interface:
 | 
			
		||||
			// Must be oneof field.
 | 
			
		||||
			switch {
 | 
			
		||||
			case isPointer || isSlice:
 | 
			
		||||
				panic("bad pointer or slice in interface case in " + tf.Name())
 | 
			
		||||
			default: // E.g., interface{}
 | 
			
		||||
				// TODO: Make this faster?
 | 
			
		||||
				mfi.merge = func(dst, src pointer) {
 | 
			
		||||
					su := src.asPointerTo(tf).Elem()
 | 
			
		||||
					if !su.IsNil() {
 | 
			
		||||
						du := dst.asPointerTo(tf).Elem()
 | 
			
		||||
						typ := su.Elem().Type()
 | 
			
		||||
						if du.IsNil() || du.Elem().Type() != typ {
 | 
			
		||||
							du.Set(reflect.New(typ.Elem())) // Initialize interface if empty
 | 
			
		||||
						}
 | 
			
		||||
						sv := su.Elem().Elem().Field(0)
 | 
			
		||||
						if sv.Kind() == reflect.Ptr && sv.IsNil() {
 | 
			
		||||
							return
 | 
			
		||||
						}
 | 
			
		||||
						dv := du.Elem().Elem().Field(0)
 | 
			
		||||
						if dv.Kind() == reflect.Ptr && dv.IsNil() {
 | 
			
		||||
							dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty
 | 
			
		||||
						}
 | 
			
		||||
						switch sv.Type().Kind() {
 | 
			
		||||
						case reflect.Ptr: // Proto struct (e.g., *T)
 | 
			
		||||
							Merge(dv.Interface().(Message), sv.Interface().(Message))
 | 
			
		||||
						case reflect.Slice: // E.g. Bytes type (e.g., []byte)
 | 
			
		||||
							dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...)))
 | 
			
		||||
						default: // Basic type (e.g., string)
 | 
			
		||||
							dv.Set(sv)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			panic(fmt.Sprintf("merger not found for type:%s", tf))
 | 
			
		||||
		}
 | 
			
		||||
		mi.fields = append(mi.fields, mfi)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mi.unrecognized = invalidField
 | 
			
		||||
	if f, ok := t.FieldByName("XXX_unrecognized"); ok {
 | 
			
		||||
		if f.Type != reflect.TypeOf([]byte{}) {
 | 
			
		||||
			panic("expected XXX_unrecognized to be of type []byte")
 | 
			
		||||
		}
 | 
			
		||||
		mi.unrecognized = toField(&f)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	atomic.StoreInt32(&mi.initialized, 1)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2053
									
								
								vendor/github.com/golang/protobuf/proto/table_unmarshal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2053
									
								
								vendor/github.com/golang/protobuf/proto/table_unmarshal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										845
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										845
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,845 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
// Functions for writing the text protocol buffer format.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"math"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	newline         = []byte("\n")
 | 
			
		||||
	spaces          = []byte("                                        ")
 | 
			
		||||
	endBraceNewline = []byte("}\n")
 | 
			
		||||
	backslashN      = []byte{'\\', 'n'}
 | 
			
		||||
	backslashR      = []byte{'\\', 'r'}
 | 
			
		||||
	backslashT      = []byte{'\\', 't'}
 | 
			
		||||
	backslashDQ     = []byte{'\\', '"'}
 | 
			
		||||
	backslashBS     = []byte{'\\', '\\'}
 | 
			
		||||
	posInf          = []byte("inf")
 | 
			
		||||
	negInf          = []byte("-inf")
 | 
			
		||||
	nan             = []byte("nan")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type writer interface {
 | 
			
		||||
	io.Writer
 | 
			
		||||
	WriteByte(byte) error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// textWriter is an io.Writer that tracks its indentation level.
 | 
			
		||||
type textWriter struct {
 | 
			
		||||
	ind      int
 | 
			
		||||
	complete bool // if the current position is a complete line
 | 
			
		||||
	compact  bool // whether to write out as a one-liner
 | 
			
		||||
	w        writer
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) WriteString(s string) (n int, err error) {
 | 
			
		||||
	if !strings.Contains(s, "\n") {
 | 
			
		||||
		if !w.compact && w.complete {
 | 
			
		||||
			w.writeIndent()
 | 
			
		||||
		}
 | 
			
		||||
		w.complete = false
 | 
			
		||||
		return io.WriteString(w.w, s)
 | 
			
		||||
	}
 | 
			
		||||
	// WriteString is typically called without newlines, so this
 | 
			
		||||
	// codepath and its copy are rare.  We copy to avoid
 | 
			
		||||
	// duplicating all of Write's logic here.
 | 
			
		||||
	return w.Write([]byte(s))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) Write(p []byte) (n int, err error) {
 | 
			
		||||
	newlines := bytes.Count(p, newline)
 | 
			
		||||
	if newlines == 0 {
 | 
			
		||||
		if !w.compact && w.complete {
 | 
			
		||||
			w.writeIndent()
 | 
			
		||||
		}
 | 
			
		||||
		n, err = w.w.Write(p)
 | 
			
		||||
		w.complete = false
 | 
			
		||||
		return n, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	frags := bytes.SplitN(p, newline, newlines+1)
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		for i, frag := range frags {
 | 
			
		||||
			if i > 0 {
 | 
			
		||||
				if err := w.w.WriteByte(' '); err != nil {
 | 
			
		||||
					return n, err
 | 
			
		||||
				}
 | 
			
		||||
				n++
 | 
			
		||||
			}
 | 
			
		||||
			nn, err := w.w.Write(frag)
 | 
			
		||||
			n += nn
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return n, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return n, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, frag := range frags {
 | 
			
		||||
		if w.complete {
 | 
			
		||||
			w.writeIndent()
 | 
			
		||||
		}
 | 
			
		||||
		nn, err := w.w.Write(frag)
 | 
			
		||||
		n += nn
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return n, err
 | 
			
		||||
		}
 | 
			
		||||
		if i+1 < len(frags) {
 | 
			
		||||
			if err := w.w.WriteByte('\n'); err != nil {
 | 
			
		||||
				return n, err
 | 
			
		||||
			}
 | 
			
		||||
			n++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	w.complete = len(frags[len(frags)-1]) == 0
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) WriteByte(c byte) error {
 | 
			
		||||
	if w.compact && c == '\n' {
 | 
			
		||||
		c = ' '
 | 
			
		||||
	}
 | 
			
		||||
	if !w.compact && w.complete {
 | 
			
		||||
		w.writeIndent()
 | 
			
		||||
	}
 | 
			
		||||
	err := w.w.WriteByte(c)
 | 
			
		||||
	w.complete = c == '\n'
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) indent() { w.ind++ }
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) unindent() {
 | 
			
		||||
	if w.ind == 0 {
 | 
			
		||||
		log.Print("proto: textWriter unindented too far")
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	w.ind--
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeName(w *textWriter, props *Properties) error {
 | 
			
		||||
	if _, err := w.WriteString(props.OrigName); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if props.Wire != "group" {
 | 
			
		||||
		return w.WriteByte(':')
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func requiresQuotes(u string) bool {
 | 
			
		||||
	// When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted.
 | 
			
		||||
	for _, ch := range u {
 | 
			
		||||
		switch {
 | 
			
		||||
		case ch == '.' || ch == '/' || ch == '_':
 | 
			
		||||
			continue
 | 
			
		||||
		case '0' <= ch && ch <= '9':
 | 
			
		||||
			continue
 | 
			
		||||
		case 'A' <= ch && ch <= 'Z':
 | 
			
		||||
			continue
 | 
			
		||||
		case 'a' <= ch && ch <= 'z':
 | 
			
		||||
			continue
 | 
			
		||||
		default:
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isAny reports whether sv is a google.protobuf.Any message
 | 
			
		||||
func isAny(sv reflect.Value) bool {
 | 
			
		||||
	type wkt interface {
 | 
			
		||||
		XXX_WellKnownType() string
 | 
			
		||||
	}
 | 
			
		||||
	t, ok := sv.Addr().Interface().(wkt)
 | 
			
		||||
	return ok && t.XXX_WellKnownType() == "Any"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeProto3Any writes an expanded google.protobuf.Any message.
 | 
			
		||||
//
 | 
			
		||||
// It returns (false, nil) if sv value can't be unmarshaled (e.g. because
 | 
			
		||||
// required messages are not linked in).
 | 
			
		||||
//
 | 
			
		||||
// It returns (true, error) when sv was written in expanded format or an error
 | 
			
		||||
// was encountered.
 | 
			
		||||
func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) {
 | 
			
		||||
	turl := sv.FieldByName("TypeUrl")
 | 
			
		||||
	val := sv.FieldByName("Value")
 | 
			
		||||
	if !turl.IsValid() || !val.IsValid() {
 | 
			
		||||
		return true, errors.New("proto: invalid google.protobuf.Any message")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b, ok := val.Interface().([]byte)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return true, errors.New("proto: invalid google.protobuf.Any message")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parts := strings.Split(turl.String(), "/")
 | 
			
		||||
	mt := MessageType(parts[len(parts)-1])
 | 
			
		||||
	if mt == nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	m := reflect.New(mt.Elem())
 | 
			
		||||
	if err := Unmarshal(b, m.Interface().(Message)); err != nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	w.Write([]byte("["))
 | 
			
		||||
	u := turl.String()
 | 
			
		||||
	if requiresQuotes(u) {
 | 
			
		||||
		writeString(w, u)
 | 
			
		||||
	} else {
 | 
			
		||||
		w.Write([]byte(u))
 | 
			
		||||
	}
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		w.Write([]byte("]:<"))
 | 
			
		||||
	} else {
 | 
			
		||||
		w.Write([]byte("]: <\n"))
 | 
			
		||||
		w.ind++
 | 
			
		||||
	}
 | 
			
		||||
	if err := tm.writeStruct(w, m.Elem()); err != nil {
 | 
			
		||||
		return true, err
 | 
			
		||||
	}
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		w.Write([]byte("> "))
 | 
			
		||||
	} else {
 | 
			
		||||
		w.ind--
 | 
			
		||||
		w.Write([]byte(">\n"))
 | 
			
		||||
	}
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error {
 | 
			
		||||
	if tm.ExpandAny && isAny(sv) {
 | 
			
		||||
		if canExpand, err := tm.writeProto3Any(w, sv); canExpand {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	st := sv.Type()
 | 
			
		||||
	sprops := GetProperties(st)
 | 
			
		||||
	for i := 0; i < sv.NumField(); i++ {
 | 
			
		||||
		fv := sv.Field(i)
 | 
			
		||||
		props := sprops.Prop[i]
 | 
			
		||||
		name := st.Field(i).Name
 | 
			
		||||
 | 
			
		||||
		if name == "XXX_NoUnkeyedLiteral" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if strings.HasPrefix(name, "XXX_") {
 | 
			
		||||
			// There are two XXX_ fields:
 | 
			
		||||
			//   XXX_unrecognized []byte
 | 
			
		||||
			//   XXX_extensions   map[int32]proto.Extension
 | 
			
		||||
			// The first is handled here;
 | 
			
		||||
			// the second is handled at the bottom of this function.
 | 
			
		||||
			if name == "XXX_unrecognized" && !fv.IsNil() {
 | 
			
		||||
				if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if fv.Kind() == reflect.Ptr && fv.IsNil() {
 | 
			
		||||
			// Field not filled in. This could be an optional field or
 | 
			
		||||
			// a required field that wasn't filled in. Either way, there
 | 
			
		||||
			// isn't anything we can show for it.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if fv.Kind() == reflect.Slice && fv.IsNil() {
 | 
			
		||||
			// Repeated field that is empty, or a bytes field that is unused.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if props.Repeated && fv.Kind() == reflect.Slice {
 | 
			
		||||
			// Repeated field.
 | 
			
		||||
			for j := 0; j < fv.Len(); j++ {
 | 
			
		||||
				if err := writeName(w, props); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if !w.compact {
 | 
			
		||||
					if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				v := fv.Index(j)
 | 
			
		||||
				if v.Kind() == reflect.Ptr && v.IsNil() {
 | 
			
		||||
					// A nil message in a repeated field is not valid,
 | 
			
		||||
					// but we can handle that more gracefully than panicking.
 | 
			
		||||
					if _, err := w.Write([]byte("<nil>\n")); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				if err := tm.writeAny(w, v, props); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if fv.Kind() == reflect.Map {
 | 
			
		||||
			// Map fields are rendered as a repeated struct with key/value fields.
 | 
			
		||||
			keys := fv.MapKeys()
 | 
			
		||||
			sort.Sort(mapKeys(keys))
 | 
			
		||||
			for _, key := range keys {
 | 
			
		||||
				val := fv.MapIndex(key)
 | 
			
		||||
				if err := writeName(w, props); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if !w.compact {
 | 
			
		||||
					if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				// open struct
 | 
			
		||||
				if err := w.WriteByte('<'); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if !w.compact {
 | 
			
		||||
					if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				w.indent()
 | 
			
		||||
				// key
 | 
			
		||||
				if _, err := w.WriteString("key:"); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if !w.compact {
 | 
			
		||||
					if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if err := tm.writeAny(w, key, props.MapKeyProp); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				// nil values aren't legal, but we can avoid panicking because of them.
 | 
			
		||||
				if val.Kind() != reflect.Ptr || !val.IsNil() {
 | 
			
		||||
					// value
 | 
			
		||||
					if _, err := w.WriteString("value:"); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if !w.compact {
 | 
			
		||||
						if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
							return err
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if err := tm.writeAny(w, val, props.MapValProp); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				// close struct
 | 
			
		||||
				w.unindent()
 | 
			
		||||
				if err := w.WriteByte('>'); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 {
 | 
			
		||||
			// empty bytes field
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice {
 | 
			
		||||
			// proto3 non-repeated scalar field; skip if zero value
 | 
			
		||||
			if isProto3Zero(fv) {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if fv.Kind() == reflect.Interface {
 | 
			
		||||
			// Check if it is a oneof.
 | 
			
		||||
			if st.Field(i).Tag.Get("protobuf_oneof") != "" {
 | 
			
		||||
				// fv is nil, or holds a pointer to generated struct.
 | 
			
		||||
				// That generated struct has exactly one field,
 | 
			
		||||
				// which has a protobuf struct tag.
 | 
			
		||||
				if fv.IsNil() {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				inner := fv.Elem().Elem() // interface -> *T -> T
 | 
			
		||||
				tag := inner.Type().Field(0).Tag.Get("protobuf")
 | 
			
		||||
				props = new(Properties) // Overwrite the outer props var, but not its pointee.
 | 
			
		||||
				props.Parse(tag)
 | 
			
		||||
				// Write the value in the oneof, not the oneof itself.
 | 
			
		||||
				fv = inner.Field(0)
 | 
			
		||||
 | 
			
		||||
				// Special case to cope with malformed messages gracefully:
 | 
			
		||||
				// If the value in the oneof is a nil pointer, don't panic
 | 
			
		||||
				// in writeAny.
 | 
			
		||||
				if fv.Kind() == reflect.Ptr && fv.IsNil() {
 | 
			
		||||
					// Use errors.New so writeAny won't render quotes.
 | 
			
		||||
					msg := errors.New("/* nil */")
 | 
			
		||||
					fv = reflect.ValueOf(&msg).Elem()
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := writeName(w, props); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if !w.compact {
 | 
			
		||||
			if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Enums have a String method, so writeAny will work fine.
 | 
			
		||||
		if err := tm.writeAny(w, fv, props); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Extensions (the XXX_extensions field).
 | 
			
		||||
	pv := sv.Addr()
 | 
			
		||||
	if _, err := extendable(pv.Interface()); err == nil {
 | 
			
		||||
		if err := tm.writeExtensions(w, pv); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
 | 
			
		||||
 | 
			
		||||
// writeAny writes an arbitrary field.
 | 
			
		||||
func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error {
 | 
			
		||||
	v = reflect.Indirect(v)
 | 
			
		||||
 | 
			
		||||
	// Floats have special cases.
 | 
			
		||||
	if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 {
 | 
			
		||||
		x := v.Float()
 | 
			
		||||
		var b []byte
 | 
			
		||||
		switch {
 | 
			
		||||
		case math.IsInf(x, 1):
 | 
			
		||||
			b = posInf
 | 
			
		||||
		case math.IsInf(x, -1):
 | 
			
		||||
			b = negInf
 | 
			
		||||
		case math.IsNaN(x):
 | 
			
		||||
			b = nan
 | 
			
		||||
		}
 | 
			
		||||
		if b != nil {
 | 
			
		||||
			_, err := w.Write(b)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		// Other values are handled below.
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We don't attempt to serialise every possible value type; only those
 | 
			
		||||
	// that can occur in protocol buffers.
 | 
			
		||||
	switch v.Kind() {
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		// Should only be a []byte; repeated fields are handled in writeStruct.
 | 
			
		||||
		if err := writeString(w, string(v.Bytes())); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		if err := writeString(w, v.String()); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		// Required/optional group/message.
 | 
			
		||||
		var bra, ket byte = '<', '>'
 | 
			
		||||
		if props != nil && props.Wire == "group" {
 | 
			
		||||
			bra, ket = '{', '}'
 | 
			
		||||
		}
 | 
			
		||||
		if err := w.WriteByte(bra); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if !w.compact {
 | 
			
		||||
			if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		w.indent()
 | 
			
		||||
		if v.CanAddr() {
 | 
			
		||||
			// Calling v.Interface on a struct causes the reflect package to
 | 
			
		||||
			// copy the entire struct. This is racy with the new Marshaler
 | 
			
		||||
			// since we atomically update the XXX_sizecache.
 | 
			
		||||
			//
 | 
			
		||||
			// Thus, we retrieve a pointer to the struct if possible to avoid
 | 
			
		||||
			// a race since v.Interface on the pointer doesn't copy the struct.
 | 
			
		||||
			//
 | 
			
		||||
			// If v is not addressable, then we are not worried about a race
 | 
			
		||||
			// since it implies that the binary Marshaler cannot possibly be
 | 
			
		||||
			// mutating this value.
 | 
			
		||||
			v = v.Addr()
 | 
			
		||||
		}
 | 
			
		||||
		if v.Type().Implements(textMarshalerType) {
 | 
			
		||||
			text, err := v.Interface().(encoding.TextMarshaler).MarshalText()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if _, err = w.Write(text); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if v.Kind() == reflect.Ptr {
 | 
			
		||||
				v = v.Elem()
 | 
			
		||||
			}
 | 
			
		||||
			if err := tm.writeStruct(w, v); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		w.unindent()
 | 
			
		||||
		if err := w.WriteByte(ket); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		_, err := fmt.Fprint(w, v.Interface())
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// equivalent to C's isprint.
 | 
			
		||||
func isprint(c byte) bool {
 | 
			
		||||
	return c >= 0x20 && c < 0x7f
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeString writes a string in the protocol buffer text format.
 | 
			
		||||
// It is similar to strconv.Quote except we don't use Go escape sequences,
 | 
			
		||||
// we treat the string as a byte sequence, and we use octal escapes.
 | 
			
		||||
// These differences are to maintain interoperability with the other
 | 
			
		||||
// languages' implementations of the text format.
 | 
			
		||||
func writeString(w *textWriter, s string) error {
 | 
			
		||||
	// use WriteByte here to get any needed indent
 | 
			
		||||
	if err := w.WriteByte('"'); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// Loop over the bytes, not the runes.
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		var err error
 | 
			
		||||
		// Divergence from C++: we don't escape apostrophes.
 | 
			
		||||
		// There's no need to escape them, and the C++ parser
 | 
			
		||||
		// copes with a naked apostrophe.
 | 
			
		||||
		switch c := s[i]; c {
 | 
			
		||||
		case '\n':
 | 
			
		||||
			_, err = w.w.Write(backslashN)
 | 
			
		||||
		case '\r':
 | 
			
		||||
			_, err = w.w.Write(backslashR)
 | 
			
		||||
		case '\t':
 | 
			
		||||
			_, err = w.w.Write(backslashT)
 | 
			
		||||
		case '"':
 | 
			
		||||
			_, err = w.w.Write(backslashDQ)
 | 
			
		||||
		case '\\':
 | 
			
		||||
			_, err = w.w.Write(backslashBS)
 | 
			
		||||
		default:
 | 
			
		||||
			if isprint(c) {
 | 
			
		||||
				err = w.w.WriteByte(c)
 | 
			
		||||
			} else {
 | 
			
		||||
				_, err = fmt.Fprintf(w.w, "\\%03o", c)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return w.WriteByte('"')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeUnknownStruct(w *textWriter, data []byte) (err error) {
 | 
			
		||||
	if !w.compact {
 | 
			
		||||
		if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	b := NewBuffer(data)
 | 
			
		||||
	for b.index < len(b.buf) {
 | 
			
		||||
		x, err := b.DecodeVarint()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			_, err := fmt.Fprintf(w, "/* %v */\n", err)
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		wire, tag := x&7, x>>3
 | 
			
		||||
		if wire == WireEndGroup {
 | 
			
		||||
			w.unindent()
 | 
			
		||||
			if _, err := w.Write(endBraceNewline); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if _, err := fmt.Fprint(w, tag); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if wire != WireStartGroup {
 | 
			
		||||
			if err := w.WriteByte(':'); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if !w.compact || wire == WireStartGroup {
 | 
			
		||||
			if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		switch wire {
 | 
			
		||||
		case WireBytes:
 | 
			
		||||
			buf, e := b.DecodeRawBytes(false)
 | 
			
		||||
			if e == nil {
 | 
			
		||||
				_, err = fmt.Fprintf(w, "%q", buf)
 | 
			
		||||
			} else {
 | 
			
		||||
				_, err = fmt.Fprintf(w, "/* %v */", e)
 | 
			
		||||
			}
 | 
			
		||||
		case WireFixed32:
 | 
			
		||||
			x, err = b.DecodeFixed32()
 | 
			
		||||
			err = writeUnknownInt(w, x, err)
 | 
			
		||||
		case WireFixed64:
 | 
			
		||||
			x, err = b.DecodeFixed64()
 | 
			
		||||
			err = writeUnknownInt(w, x, err)
 | 
			
		||||
		case WireStartGroup:
 | 
			
		||||
			err = w.WriteByte('{')
 | 
			
		||||
			w.indent()
 | 
			
		||||
		case WireVarint:
 | 
			
		||||
			x, err = b.DecodeVarint()
 | 
			
		||||
			err = writeUnknownInt(w, x, err)
 | 
			
		||||
		default:
 | 
			
		||||
			_, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire)
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if err = w.WriteByte('\n'); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeUnknownInt(w *textWriter, x uint64, err error) error {
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		_, err = fmt.Fprint(w, x)
 | 
			
		||||
	} else {
 | 
			
		||||
		_, err = fmt.Fprintf(w, "/* %v */", err)
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type int32Slice []int32
 | 
			
		||||
 | 
			
		||||
func (s int32Slice) Len() int           { return len(s) }
 | 
			
		||||
func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] }
 | 
			
		||||
func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 | 
			
		||||
 | 
			
		||||
// writeExtensions writes all the extensions in pv.
 | 
			
		||||
// pv is assumed to be a pointer to a protocol message struct that is extendable.
 | 
			
		||||
func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error {
 | 
			
		||||
	emap := extensionMaps[pv.Type().Elem()]
 | 
			
		||||
	ep, _ := extendable(pv.Interface())
 | 
			
		||||
 | 
			
		||||
	// Order the extensions by ID.
 | 
			
		||||
	// This isn't strictly necessary, but it will give us
 | 
			
		||||
	// canonical output, which will also make testing easier.
 | 
			
		||||
	m, mu := ep.extensionsRead()
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	mu.Lock()
 | 
			
		||||
	ids := make([]int32, 0, len(m))
 | 
			
		||||
	for id := range m {
 | 
			
		||||
		ids = append(ids, id)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Sort(int32Slice(ids))
 | 
			
		||||
	mu.Unlock()
 | 
			
		||||
 | 
			
		||||
	for _, extNum := range ids {
 | 
			
		||||
		ext := m[extNum]
 | 
			
		||||
		var desc *ExtensionDesc
 | 
			
		||||
		if emap != nil {
 | 
			
		||||
			desc = emap[extNum]
 | 
			
		||||
		}
 | 
			
		||||
		if desc == nil {
 | 
			
		||||
			// Unknown extension.
 | 
			
		||||
			if err := writeUnknownStruct(w, ext.enc); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pb, err := GetExtension(ep, desc)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("failed getting extension: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Repeated extensions will appear as a slice.
 | 
			
		||||
		if !desc.repeated() {
 | 
			
		||||
			if err := tm.writeExtension(w, desc.Name, pb); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			v := reflect.ValueOf(pb)
 | 
			
		||||
			for i := 0; i < v.Len(); i++ {
 | 
			
		||||
				if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error {
 | 
			
		||||
	if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if !w.compact {
 | 
			
		||||
		if err := w.WriteByte(' '); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := w.WriteByte('\n'); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeIndent() {
 | 
			
		||||
	if !w.complete {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	remain := w.ind * 2
 | 
			
		||||
	for remain > 0 {
 | 
			
		||||
		n := remain
 | 
			
		||||
		if n > len(spaces) {
 | 
			
		||||
			n = len(spaces)
 | 
			
		||||
		}
 | 
			
		||||
		w.w.Write(spaces[:n])
 | 
			
		||||
		remain -= n
 | 
			
		||||
	}
 | 
			
		||||
	w.complete = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TextMarshaler is a configurable text format marshaler.
 | 
			
		||||
type TextMarshaler struct {
 | 
			
		||||
	Compact   bool // use compact text format (one line).
 | 
			
		||||
	ExpandAny bool // expand google.protobuf.Any messages of known types
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshal writes a given protocol buffer in text format.
 | 
			
		||||
// The only errors returned are from w.
 | 
			
		||||
func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error {
 | 
			
		||||
	val := reflect.ValueOf(pb)
 | 
			
		||||
	if pb == nil || val.IsNil() {
 | 
			
		||||
		w.Write([]byte("<nil>"))
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var bw *bufio.Writer
 | 
			
		||||
	ww, ok := w.(writer)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		bw = bufio.NewWriter(w)
 | 
			
		||||
		ww = bw
 | 
			
		||||
	}
 | 
			
		||||
	aw := &textWriter{
 | 
			
		||||
		w:        ww,
 | 
			
		||||
		complete: true,
 | 
			
		||||
		compact:  tm.Compact,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if etm, ok := pb.(encoding.TextMarshaler); ok {
 | 
			
		||||
		text, err := etm.MarshalText()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if _, err = aw.Write(text); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if bw != nil {
 | 
			
		||||
			return bw.Flush()
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	// Dereference the received pointer so we don't have outer < and >.
 | 
			
		||||
	v := reflect.Indirect(val)
 | 
			
		||||
	if err := tm.writeStruct(aw, v); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if bw != nil {
 | 
			
		||||
		return bw.Flush()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Text is the same as Marshal, but returns the string directly.
 | 
			
		||||
func (tm *TextMarshaler) Text(pb Message) string {
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	tm.Marshal(&buf, pb)
 | 
			
		||||
	return buf.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	defaultTextMarshaler = TextMarshaler{}
 | 
			
		||||
	compactTextMarshaler = TextMarshaler{Compact: true}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TODO: consider removing some of the Marshal functions below.
 | 
			
		||||
 | 
			
		||||
// MarshalText writes a given protocol buffer in text format.
 | 
			
		||||
// The only errors returned are from w.
 | 
			
		||||
func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) }
 | 
			
		||||
 | 
			
		||||
// MarshalTextString is the same as MarshalText, but returns the string directly.
 | 
			
		||||
func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) }
 | 
			
		||||
 | 
			
		||||
// CompactText writes a given protocol buffer in compact text format (one line).
 | 
			
		||||
func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) }
 | 
			
		||||
 | 
			
		||||
// CompactTextString is the same as CompactText, but returns the string directly.
 | 
			
		||||
func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) }
 | 
			
		||||
							
								
								
									
										801
									
								
								vendor/github.com/golang/protobuf/proto/text_decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										801
									
								
								vendor/github.com/golang/protobuf/proto/text_decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,801 @@
 | 
			
		|||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
			
		||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const wrapTextUnmarshalV2 = false
 | 
			
		||||
 | 
			
		||||
// ParseError is returned by UnmarshalText.
 | 
			
		||||
type ParseError struct {
 | 
			
		||||
	Message string
 | 
			
		||||
 | 
			
		||||
	// Deprecated: Do not use.
 | 
			
		||||
	Line, Offset int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *ParseError) Error() string {
 | 
			
		||||
	if wrapTextUnmarshalV2 {
 | 
			
		||||
		return e.Message
 | 
			
		||||
	}
 | 
			
		||||
	if e.Line == 1 {
 | 
			
		||||
		return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("line %d: %v", e.Line, e.Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalText parses a proto text formatted string into m.
 | 
			
		||||
func UnmarshalText(s string, m Message) error {
 | 
			
		||||
	if u, ok := m.(encoding.TextUnmarshaler); ok {
 | 
			
		||||
		return u.UnmarshalText([]byte(s))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m.Reset()
 | 
			
		||||
	mi := MessageV2(m)
 | 
			
		||||
 | 
			
		||||
	if wrapTextUnmarshalV2 {
 | 
			
		||||
		err := prototext.UnmarshalOptions{
 | 
			
		||||
			AllowPartial: true,
 | 
			
		||||
		}.Unmarshal([]byte(s), mi)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return &ParseError{Message: err.Error()}
 | 
			
		||||
		}
 | 
			
		||||
		return checkRequiredNotSet(mi)
 | 
			
		||||
	} else {
 | 
			
		||||
		if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		return checkRequiredNotSet(mi)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type textParser struct {
 | 
			
		||||
	s            string // remaining input
 | 
			
		||||
	done         bool   // whether the parsing is finished (success or error)
 | 
			
		||||
	backed       bool   // whether back() was called
 | 
			
		||||
	offset, line int
 | 
			
		||||
	cur          token
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type token struct {
 | 
			
		||||
	value    string
 | 
			
		||||
	err      *ParseError
 | 
			
		||||
	line     int    // line number
 | 
			
		||||
	offset   int    // byte number from start of input, not start of line
 | 
			
		||||
	unquoted string // the unquoted version of value, if it was a quoted string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newTextParser(s string) *textParser {
 | 
			
		||||
	p := new(textParser)
 | 
			
		||||
	p.s = s
 | 
			
		||||
	p.line = 1
 | 
			
		||||
	p.cur.line = 1
 | 
			
		||||
	return p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) {
 | 
			
		||||
	md := m.Descriptor()
 | 
			
		||||
	fds := md.Fields()
 | 
			
		||||
 | 
			
		||||
	// A struct is a sequence of "name: value", terminated by one of
 | 
			
		||||
	// '>' or '}', or the end of the input.  A name may also be
 | 
			
		||||
	// "[extension]" or "[type/url]".
 | 
			
		||||
	//
 | 
			
		||||
	// The whole struct can also be an expanded Any message, like:
 | 
			
		||||
	// [type/url] < ... struct contents ... >
 | 
			
		||||
	seen := make(map[protoreflect.FieldNumber]bool)
 | 
			
		||||
	for {
 | 
			
		||||
		tok := p.next()
 | 
			
		||||
		if tok.err != nil {
 | 
			
		||||
			return tok.err
 | 
			
		||||
		}
 | 
			
		||||
		if tok.value == terminator {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if tok.value == "[" {
 | 
			
		||||
			if err := p.unmarshalExtensionOrAny(m, seen); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// This is a normal, non-extension field.
 | 
			
		||||
		name := protoreflect.Name(tok.value)
 | 
			
		||||
		fd := fds.ByName(name)
 | 
			
		||||
		switch {
 | 
			
		||||
		case fd == nil:
 | 
			
		||||
			gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name))))
 | 
			
		||||
			if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name {
 | 
			
		||||
				fd = gd
 | 
			
		||||
			}
 | 
			
		||||
		case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name:
 | 
			
		||||
			fd = nil
 | 
			
		||||
		case fd.IsWeak() && fd.Message().IsPlaceholder():
 | 
			
		||||
			fd = nil
 | 
			
		||||
		}
 | 
			
		||||
		if fd == nil {
 | 
			
		||||
			typeName := string(md.FullName())
 | 
			
		||||
			if m, ok := m.Interface().(Message); ok {
 | 
			
		||||
				t := reflect.TypeOf(m)
 | 
			
		||||
				if t.Kind() == reflect.Ptr {
 | 
			
		||||
					typeName = t.Elem().String()
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return p.errorf("unknown field name %q in %v", name, typeName)
 | 
			
		||||
		}
 | 
			
		||||
		if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil {
 | 
			
		||||
			return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name())
 | 
			
		||||
		}
 | 
			
		||||
		if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] {
 | 
			
		||||
			return p.errorf("non-repeated field %q was repeated", fd.Name())
 | 
			
		||||
		}
 | 
			
		||||
		seen[fd.Number()] = true
 | 
			
		||||
 | 
			
		||||
		// Consume any colon.
 | 
			
		||||
		if err := p.checkForColon(fd); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Parse into the field.
 | 
			
		||||
		v := m.Get(fd)
 | 
			
		||||
		if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
 | 
			
		||||
			v = m.Mutable(fd)
 | 
			
		||||
		}
 | 
			
		||||
		if v, err = p.unmarshalValue(v, fd); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		m.Set(fd, v)
 | 
			
		||||
 | 
			
		||||
		if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error {
 | 
			
		||||
	name, err := p.consumeExtensionOrAnyName()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If it contains a slash, it's an Any type URL.
 | 
			
		||||
	if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 {
 | 
			
		||||
		tok := p.next()
 | 
			
		||||
		if tok.err != nil {
 | 
			
		||||
			return tok.err
 | 
			
		||||
		}
 | 
			
		||||
		// consume an optional colon
 | 
			
		||||
		if tok.value == ":" {
 | 
			
		||||
			tok = p.next()
 | 
			
		||||
			if tok.err != nil {
 | 
			
		||||
				return tok.err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var terminator string
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "<":
 | 
			
		||||
			terminator = ">"
 | 
			
		||||
		case "{":
 | 
			
		||||
			terminator = "}"
 | 
			
		||||
		default:
 | 
			
		||||
			return p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mt, err := protoregistry.GlobalTypes.FindMessageByURL(name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):])
 | 
			
		||||
		}
 | 
			
		||||
		m2 := mt.New()
 | 
			
		||||
		if err := p.unmarshalMessage(m2, terminator); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		b, err := protoV2.Marshal(m2.Interface())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		urlFD := m.Descriptor().Fields().ByName("type_url")
 | 
			
		||||
		valFD := m.Descriptor().Fields().ByName("value")
 | 
			
		||||
		if seen[urlFD.Number()] {
 | 
			
		||||
			return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name())
 | 
			
		||||
		}
 | 
			
		||||
		if seen[valFD.Number()] {
 | 
			
		||||
			return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name())
 | 
			
		||||
		}
 | 
			
		||||
		m.Set(urlFD, protoreflect.ValueOfString(name))
 | 
			
		||||
		m.Set(valFD, protoreflect.ValueOfBytes(b))
 | 
			
		||||
		seen[urlFD.Number()] = true
 | 
			
		||||
		seen[valFD.Number()] = true
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	xname := protoreflect.FullName(name)
 | 
			
		||||
	xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname)
 | 
			
		||||
	if xt == nil && isMessageSet(m.Descriptor()) {
 | 
			
		||||
		xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension"))
 | 
			
		||||
	}
 | 
			
		||||
	if xt == nil {
 | 
			
		||||
		return p.errorf("unrecognized extension %q", name)
 | 
			
		||||
	}
 | 
			
		||||
	fd := xt.TypeDescriptor()
 | 
			
		||||
	if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
 | 
			
		||||
		return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := p.checkForColon(fd); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	v := m.Get(fd)
 | 
			
		||||
	if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
 | 
			
		||||
		v = m.Mutable(fd)
 | 
			
		||||
	}
 | 
			
		||||
	v, err = p.unmarshalValue(v, fd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	m.Set(fd, v)
 | 
			
		||||
	return p.consumeOptionalSeparator()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return v, tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value == "" {
 | 
			
		||||
		return v, p.errorf("unexpected EOF")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case fd.IsList():
 | 
			
		||||
		lv := v.List()
 | 
			
		||||
		var err error
 | 
			
		||||
		if tok.value == "[" {
 | 
			
		||||
			// Repeated field with list notation, like [1,2,3].
 | 
			
		||||
			for {
 | 
			
		||||
				vv := lv.NewElement()
 | 
			
		||||
				vv, err = p.unmarshalSingularValue(vv, fd)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
				lv.Append(vv)
 | 
			
		||||
 | 
			
		||||
				tok := p.next()
 | 
			
		||||
				if tok.err != nil {
 | 
			
		||||
					return v, tok.err
 | 
			
		||||
				}
 | 
			
		||||
				if tok.value == "]" {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
				if tok.value != "," {
 | 
			
		||||
					return v, p.errorf("Expected ']' or ',' found %q", tok.value)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return v, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// One value of the repeated field.
 | 
			
		||||
		p.back()
 | 
			
		||||
		vv := lv.NewElement()
 | 
			
		||||
		vv, err = p.unmarshalSingularValue(vv, fd)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return v, err
 | 
			
		||||
		}
 | 
			
		||||
		lv.Append(vv)
 | 
			
		||||
		return v, nil
 | 
			
		||||
	case fd.IsMap():
 | 
			
		||||
		// The map entry should be this sequence of tokens:
 | 
			
		||||
		//	< key : KEY value : VALUE >
 | 
			
		||||
		// However, implementations may omit key or value, and technically
 | 
			
		||||
		// we should support them in any order.
 | 
			
		||||
		var terminator string
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "<":
 | 
			
		||||
			terminator = ">"
 | 
			
		||||
		case "{":
 | 
			
		||||
			terminator = "}"
 | 
			
		||||
		default:
 | 
			
		||||
			return v, p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		keyFD := fd.MapKey()
 | 
			
		||||
		valFD := fd.MapValue()
 | 
			
		||||
 | 
			
		||||
		mv := v.Map()
 | 
			
		||||
		kv := keyFD.Default()
 | 
			
		||||
		vv := mv.NewValue()
 | 
			
		||||
		for {
 | 
			
		||||
			tok := p.next()
 | 
			
		||||
			if tok.err != nil {
 | 
			
		||||
				return v, tok.err
 | 
			
		||||
			}
 | 
			
		||||
			if tok.value == terminator {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			var err error
 | 
			
		||||
			switch tok.value {
 | 
			
		||||
			case "key":
 | 
			
		||||
				if err := p.consumeToken(":"); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
				if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
				if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
			case "value":
 | 
			
		||||
				if err := p.checkForColon(valFD); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
				if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
				if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
					return v, err
 | 
			
		||||
				}
 | 
			
		||||
			default:
 | 
			
		||||
				p.back()
 | 
			
		||||
				return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		mv.Set(kv.MapKey(), vv)
 | 
			
		||||
		return v, nil
 | 
			
		||||
	default:
 | 
			
		||||
		p.back()
 | 
			
		||||
		return p.unmarshalSingularValue(v, fd)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return v, tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value == "" {
 | 
			
		||||
		return v, p.errorf("unexpected EOF")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch fd.Kind() {
 | 
			
		||||
	case protoreflect.BoolKind:
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "true", "1", "t", "True":
 | 
			
		||||
			return protoreflect.ValueOfBool(true), nil
 | 
			
		||||
		case "false", "0", "f", "False":
 | 
			
		||||
			return protoreflect.ValueOfBool(false), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
 | 
			
		||||
		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfInt32(int32(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The C++ parser accepts large positive hex numbers that uses
 | 
			
		||||
		// two's complement arithmetic to represent negative numbers.
 | 
			
		||||
		// This feature is here for backwards compatibility with C++.
 | 
			
		||||
		if strings.HasPrefix(tok.value, "0x") {
 | 
			
		||||
			if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
 | 
			
		||||
				return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
 | 
			
		||||
		if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfInt64(int64(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The C++ parser accepts large positive hex numbers that uses
 | 
			
		||||
		// two's complement arithmetic to represent negative numbers.
 | 
			
		||||
		// This feature is here for backwards compatibility with C++.
 | 
			
		||||
		if strings.HasPrefix(tok.value, "0x") {
 | 
			
		||||
			if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
 | 
			
		||||
				return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
 | 
			
		||||
		if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfUint32(uint32(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
 | 
			
		||||
		if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfUint64(uint64(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.FloatKind:
 | 
			
		||||
		// Ignore 'f' for compatibility with output generated by C++,
 | 
			
		||||
		// but don't remove 'f' when the value is "-inf" or "inf".
 | 
			
		||||
		v := tok.value
 | 
			
		||||
		if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
 | 
			
		||||
			v = v[:len(v)-len("f")]
 | 
			
		||||
		}
 | 
			
		||||
		if x, err := strconv.ParseFloat(v, 32); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfFloat32(float32(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.DoubleKind:
 | 
			
		||||
		// Ignore 'f' for compatibility with output generated by C++,
 | 
			
		||||
		// but don't remove 'f' when the value is "-inf" or "inf".
 | 
			
		||||
		v := tok.value
 | 
			
		||||
		if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
 | 
			
		||||
			v = v[:len(v)-len("f")]
 | 
			
		||||
		}
 | 
			
		||||
		if x, err := strconv.ParseFloat(v, 64); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfFloat64(float64(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.StringKind:
 | 
			
		||||
		if isQuote(tok.value[0]) {
 | 
			
		||||
			return protoreflect.ValueOfString(tok.unquoted), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.BytesKind:
 | 
			
		||||
		if isQuote(tok.value[0]) {
 | 
			
		||||
			return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.EnumKind:
 | 
			
		||||
		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
 | 
			
		||||
			return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil
 | 
			
		||||
		}
 | 
			
		||||
		vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value))
 | 
			
		||||
		if vd != nil {
 | 
			
		||||
			return protoreflect.ValueOfEnum(vd.Number()), nil
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
			
		||||
		var terminator string
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "{":
 | 
			
		||||
			terminator = "}"
 | 
			
		||||
		case "<":
 | 
			
		||||
			terminator = ">"
 | 
			
		||||
		default:
 | 
			
		||||
			return v, p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
		err := p.unmarshalMessage(v.Message(), terminator)
 | 
			
		||||
		return v, err
 | 
			
		||||
	default:
 | 
			
		||||
		panic(fmt.Sprintf("invalid kind %v", fd.Kind()))
 | 
			
		||||
	}
 | 
			
		||||
	return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Consume a ':' from the input stream (if the next token is a colon),
 | 
			
		||||
// returning an error if a colon is needed but not present.
 | 
			
		||||
func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *ParseError {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != ":" {
 | 
			
		||||
		if fd.Message() == nil {
 | 
			
		||||
			return p.errorf("expected ':', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
		p.back()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeExtensionOrAnyName consumes an extension name or an Any type URL and
 | 
			
		||||
// the following ']'. It returns the name or URL consumed.
 | 
			
		||||
func (p *textParser) consumeExtensionOrAnyName() (string, error) {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return "", tok.err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If extension name or type url is quoted, it's a single token.
 | 
			
		||||
	if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {
 | 
			
		||||
		name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		return name, p.consumeToken("]")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Consume everything up to "]"
 | 
			
		||||
	var parts []string
 | 
			
		||||
	for tok.value != "]" {
 | 
			
		||||
		parts = append(parts, tok.value)
 | 
			
		||||
		tok = p.next()
 | 
			
		||||
		if tok.err != nil {
 | 
			
		||||
			return "", p.errorf("unrecognized type_url or extension name: %s", tok.err)
 | 
			
		||||
		}
 | 
			
		||||
		if p.done && tok.value != "]" {
 | 
			
		||||
			return "", p.errorf("unclosed type_url or extension name")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(parts, ""), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeOptionalSeparator consumes an optional semicolon or comma.
 | 
			
		||||
// It is used in unmarshalMessage to provide backward compatibility.
 | 
			
		||||
func (p *textParser) consumeOptionalSeparator() error {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != ";" && tok.value != "," {
 | 
			
		||||
		p.back()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) errorf(format string, a ...interface{}) *ParseError {
 | 
			
		||||
	pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset}
 | 
			
		||||
	p.cur.err = pe
 | 
			
		||||
	p.done = true
 | 
			
		||||
	return pe
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) skipWhitespace() {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {
 | 
			
		||||
		if p.s[i] == '#' {
 | 
			
		||||
			// comment; skip to end of line or input
 | 
			
		||||
			for i < len(p.s) && p.s[i] != '\n' {
 | 
			
		||||
				i++
 | 
			
		||||
			}
 | 
			
		||||
			if i == len(p.s) {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if p.s[i] == '\n' {
 | 
			
		||||
			p.line++
 | 
			
		||||
		}
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	p.offset += i
 | 
			
		||||
	p.s = p.s[i:len(p.s)]
 | 
			
		||||
	if len(p.s) == 0 {
 | 
			
		||||
		p.done = true
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) advance() {
 | 
			
		||||
	// Skip whitespace
 | 
			
		||||
	p.skipWhitespace()
 | 
			
		||||
	if p.done {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Start of non-whitespace
 | 
			
		||||
	p.cur.err = nil
 | 
			
		||||
	p.cur.offset, p.cur.line = p.offset, p.line
 | 
			
		||||
	p.cur.unquoted = ""
 | 
			
		||||
	switch p.s[0] {
 | 
			
		||||
	case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':
 | 
			
		||||
		// Single symbol
 | 
			
		||||
		p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]
 | 
			
		||||
	case '"', '\'':
 | 
			
		||||
		// Quoted string
 | 
			
		||||
		i := 1
 | 
			
		||||
		for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' {
 | 
			
		||||
			if p.s[i] == '\\' && i+1 < len(p.s) {
 | 
			
		||||
				// skip escaped char
 | 
			
		||||
				i++
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if i >= len(p.s) || p.s[i] != p.s[0] {
 | 
			
		||||
			p.errorf("unmatched quote")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		unq, err := unquoteC(p.s[1:i], rune(p.s[0]))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)]
 | 
			
		||||
		p.cur.unquoted = unq
 | 
			
		||||
	default:
 | 
			
		||||
		i := 0
 | 
			
		||||
		for i < len(p.s) && isIdentOrNumberChar(p.s[i]) {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if i == 0 {
 | 
			
		||||
			p.errorf("unexpected byte %#x", p.s[0])
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)]
 | 
			
		||||
	}
 | 
			
		||||
	p.offset += len(p.cur.value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Back off the parser by one token. Can only be done between calls to next().
 | 
			
		||||
// It makes the next advance() a no-op.
 | 
			
		||||
func (p *textParser) back() { p.backed = true }
 | 
			
		||||
 | 
			
		||||
// Advances the parser and returns the new current token.
 | 
			
		||||
func (p *textParser) next() *token {
 | 
			
		||||
	if p.backed || p.done {
 | 
			
		||||
		p.backed = false
 | 
			
		||||
		return &p.cur
 | 
			
		||||
	}
 | 
			
		||||
	p.advance()
 | 
			
		||||
	if p.done {
 | 
			
		||||
		p.cur.value = ""
 | 
			
		||||
	} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {
 | 
			
		||||
		// Look for multiple quoted strings separated by whitespace,
 | 
			
		||||
		// and concatenate them.
 | 
			
		||||
		cat := p.cur
 | 
			
		||||
		for {
 | 
			
		||||
			p.skipWhitespace()
 | 
			
		||||
			if p.done || !isQuote(p.s[0]) {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			p.advance()
 | 
			
		||||
			if p.cur.err != nil {
 | 
			
		||||
				return &p.cur
 | 
			
		||||
			}
 | 
			
		||||
			cat.value += " " + p.cur.value
 | 
			
		||||
			cat.unquoted += p.cur.unquoted
 | 
			
		||||
		}
 | 
			
		||||
		p.done = false // parser may have seen EOF, but we want to return cat
 | 
			
		||||
		p.cur = cat
 | 
			
		||||
	}
 | 
			
		||||
	return &p.cur
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) consumeToken(s string) error {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != s {
 | 
			
		||||
		p.back()
 | 
			
		||||
		return p.errorf("expected %q, found %q", s, tok.value)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var errBadUTF8 = errors.New("proto: bad UTF-8")
 | 
			
		||||
 | 
			
		||||
func unquoteC(s string, quote rune) (string, error) {
 | 
			
		||||
	// This is based on C++'s tokenizer.cc.
 | 
			
		||||
	// Despite its name, this is *not* parsing C syntax.
 | 
			
		||||
	// For instance, "\0" is an invalid quoted string.
 | 
			
		||||
 | 
			
		||||
	// Avoid allocation in trivial cases.
 | 
			
		||||
	simple := true
 | 
			
		||||
	for _, r := range s {
 | 
			
		||||
		if r == '\\' || r == quote {
 | 
			
		||||
			simple = false
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if simple {
 | 
			
		||||
		return s, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	buf := make([]byte, 0, 3*len(s)/2)
 | 
			
		||||
	for len(s) > 0 {
 | 
			
		||||
		r, n := utf8.DecodeRuneInString(s)
 | 
			
		||||
		if r == utf8.RuneError && n == 1 {
 | 
			
		||||
			return "", errBadUTF8
 | 
			
		||||
		}
 | 
			
		||||
		s = s[n:]
 | 
			
		||||
		if r != '\\' {
 | 
			
		||||
			if r < utf8.RuneSelf {
 | 
			
		||||
				buf = append(buf, byte(r))
 | 
			
		||||
			} else {
 | 
			
		||||
				buf = append(buf, string(r)...)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ch, tail, err := unescape(s)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		buf = append(buf, ch...)
 | 
			
		||||
		s = tail
 | 
			
		||||
	}
 | 
			
		||||
	return string(buf), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unescape(s string) (ch string, tail string, err error) {
 | 
			
		||||
	r, n := utf8.DecodeRuneInString(s)
 | 
			
		||||
	if r == utf8.RuneError && n == 1 {
 | 
			
		||||
		return "", "", errBadUTF8
 | 
			
		||||
	}
 | 
			
		||||
	s = s[n:]
 | 
			
		||||
	switch r {
 | 
			
		||||
	case 'a':
 | 
			
		||||
		return "\a", s, nil
 | 
			
		||||
	case 'b':
 | 
			
		||||
		return "\b", s, nil
 | 
			
		||||
	case 'f':
 | 
			
		||||
		return "\f", s, nil
 | 
			
		||||
	case 'n':
 | 
			
		||||
		return "\n", s, nil
 | 
			
		||||
	case 'r':
 | 
			
		||||
		return "\r", s, nil
 | 
			
		||||
	case 't':
 | 
			
		||||
		return "\t", s, nil
 | 
			
		||||
	case 'v':
 | 
			
		||||
		return "\v", s, nil
 | 
			
		||||
	case '?':
 | 
			
		||||
		return "?", s, nil // trigraph workaround
 | 
			
		||||
	case '\'', '"', '\\':
 | 
			
		||||
		return string(r), s, nil
 | 
			
		||||
	case '0', '1', '2', '3', '4', '5', '6', '7':
 | 
			
		||||
		if len(s) < 2 {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c requires 2 following digits`, r)
 | 
			
		||||
		}
 | 
			
		||||
		ss := string(r) + s[:2]
 | 
			
		||||
		s = s[2:]
 | 
			
		||||
		i, err := strconv.ParseUint(ss, 8, 8)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss)
 | 
			
		||||
		}
 | 
			
		||||
		return string([]byte{byte(i)}), s, nil
 | 
			
		||||
	case 'x', 'X', 'u', 'U':
 | 
			
		||||
		var n int
 | 
			
		||||
		switch r {
 | 
			
		||||
		case 'x', 'X':
 | 
			
		||||
			n = 2
 | 
			
		||||
		case 'u':
 | 
			
		||||
			n = 4
 | 
			
		||||
		case 'U':
 | 
			
		||||
			n = 8
 | 
			
		||||
		}
 | 
			
		||||
		if len(s) < n {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n)
 | 
			
		||||
		}
 | 
			
		||||
		ss := s[:n]
 | 
			
		||||
		s = s[n:]
 | 
			
		||||
		i, err := strconv.ParseUint(ss, 16, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss)
 | 
			
		||||
		}
 | 
			
		||||
		if r == 'x' || r == 'X' {
 | 
			
		||||
			return string([]byte{byte(i)}), s, nil
 | 
			
		||||
		}
 | 
			
		||||
		if i > utf8.MaxRune {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss)
 | 
			
		||||
		}
 | 
			
		||||
		return string(i), s, nil
 | 
			
		||||
	}
 | 
			
		||||
	return "", "", fmt.Errorf(`unknown escape \%c`, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isIdentOrNumberChar(c byte) bool {
 | 
			
		||||
	switch {
 | 
			
		||||
	case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z':
 | 
			
		||||
		return true
 | 
			
		||||
	case '0' <= c && c <= '9':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	switch c {
 | 
			
		||||
	case '-', '+', '.', '_':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isWhitespace(c byte) bool {
 | 
			
		||||
	switch c {
 | 
			
		||||
	case ' ', '\t', '\n', '\r':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isQuote(c byte) bool {
 | 
			
		||||
	switch c {
 | 
			
		||||
	case '"', '\'':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										560
									
								
								vendor/github.com/golang/protobuf/proto/text_encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										560
									
								
								vendor/github.com/golang/protobuf/proto/text_encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,560 @@
 | 
			
		|||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"math"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
			
		||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
			
		||||
	"google.golang.org/protobuf/proto"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const wrapTextMarshalV2 = false
 | 
			
		||||
 | 
			
		||||
// TextMarshaler is a configurable text format marshaler.
 | 
			
		||||
type TextMarshaler struct {
 | 
			
		||||
	Compact   bool // use compact text format (one line)
 | 
			
		||||
	ExpandAny bool // expand google.protobuf.Any messages of known types
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshal writes the proto text format of m to w.
 | 
			
		||||
func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error {
 | 
			
		||||
	b, err := tm.marshal(m)
 | 
			
		||||
	if len(b) > 0 {
 | 
			
		||||
		if _, err := w.Write(b); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Text returns a proto text formatted string of m.
 | 
			
		||||
func (tm *TextMarshaler) Text(m Message) string {
 | 
			
		||||
	b, _ := tm.marshal(m)
 | 
			
		||||
	return string(b)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tm *TextMarshaler) marshal(m Message) ([]byte, error) {
 | 
			
		||||
	mr := MessageReflect(m)
 | 
			
		||||
	if mr == nil || !mr.IsValid() {
 | 
			
		||||
		return []byte("<nil>"), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if wrapTextMarshalV2 {
 | 
			
		||||
		if m, ok := m.(encoding.TextMarshaler); ok {
 | 
			
		||||
			return m.MarshalText()
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		opts := prototext.MarshalOptions{
 | 
			
		||||
			AllowPartial: true,
 | 
			
		||||
			EmitUnknown:  true,
 | 
			
		||||
		}
 | 
			
		||||
		if !tm.Compact {
 | 
			
		||||
			opts.Indent = "  "
 | 
			
		||||
		}
 | 
			
		||||
		if !tm.ExpandAny {
 | 
			
		||||
			opts.Resolver = (*protoregistry.Types)(nil)
 | 
			
		||||
		}
 | 
			
		||||
		return opts.Marshal(mr.Interface())
 | 
			
		||||
	} else {
 | 
			
		||||
		w := &textWriter{
 | 
			
		||||
			compact:   tm.Compact,
 | 
			
		||||
			expandAny: tm.ExpandAny,
 | 
			
		||||
			complete:  true,
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if m, ok := m.(encoding.TextMarshaler); ok {
 | 
			
		||||
			b, err := m.MarshalText()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			w.Write(b)
 | 
			
		||||
			return w.buf, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		err := w.writeMessage(mr)
 | 
			
		||||
		return w.buf, err
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	defaultTextMarshaler = TextMarshaler{}
 | 
			
		||||
	compactTextMarshaler = TextMarshaler{Compact: true}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MarshalText writes the proto text format of m to w.
 | 
			
		||||
func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) }
 | 
			
		||||
 | 
			
		||||
// MarshalTextString returns a proto text formatted string of m.
 | 
			
		||||
func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) }
 | 
			
		||||
 | 
			
		||||
// CompactText writes the compact proto text format of m to w.
 | 
			
		||||
func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) }
 | 
			
		||||
 | 
			
		||||
// CompactTextString returns a compact proto text formatted string of m.
 | 
			
		||||
func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) }
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	newline         = []byte("\n")
 | 
			
		||||
	endBraceNewline = []byte("}\n")
 | 
			
		||||
	posInf          = []byte("inf")
 | 
			
		||||
	negInf          = []byte("-inf")
 | 
			
		||||
	nan             = []byte("nan")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// textWriter is an io.Writer that tracks its indentation level.
 | 
			
		||||
type textWriter struct {
 | 
			
		||||
	compact   bool // same as TextMarshaler.Compact
 | 
			
		||||
	expandAny bool // same as TextMarshaler.ExpandAny
 | 
			
		||||
	complete  bool // whether the current position is a complete line
 | 
			
		||||
	indent    int  // indentation level; never negative
 | 
			
		||||
	buf       []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) Write(p []byte) (n int, _ error) {
 | 
			
		||||
	newlines := bytes.Count(p, newline)
 | 
			
		||||
	if newlines == 0 {
 | 
			
		||||
		if !w.compact && w.complete {
 | 
			
		||||
			w.writeIndent()
 | 
			
		||||
		}
 | 
			
		||||
		w.buf = append(w.buf, p...)
 | 
			
		||||
		w.complete = false
 | 
			
		||||
		return len(p), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	frags := bytes.SplitN(p, newline, newlines+1)
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		for i, frag := range frags {
 | 
			
		||||
			if i > 0 {
 | 
			
		||||
				w.buf = append(w.buf, ' ')
 | 
			
		||||
				n++
 | 
			
		||||
			}
 | 
			
		||||
			w.buf = append(w.buf, frag...)
 | 
			
		||||
			n += len(frag)
 | 
			
		||||
		}
 | 
			
		||||
		return n, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, frag := range frags {
 | 
			
		||||
		if w.complete {
 | 
			
		||||
			w.writeIndent()
 | 
			
		||||
		}
 | 
			
		||||
		w.buf = append(w.buf, frag...)
 | 
			
		||||
		n += len(frag)
 | 
			
		||||
		if i+1 < len(frags) {
 | 
			
		||||
			w.buf = append(w.buf, '\n')
 | 
			
		||||
			n++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	w.complete = len(frags[len(frags)-1]) == 0
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) WriteByte(c byte) error {
 | 
			
		||||
	if w.compact && c == '\n' {
 | 
			
		||||
		c = ' '
 | 
			
		||||
	}
 | 
			
		||||
	if !w.compact && w.complete {
 | 
			
		||||
		w.writeIndent()
 | 
			
		||||
	}
 | 
			
		||||
	w.buf = append(w.buf, c)
 | 
			
		||||
	w.complete = c == '\n'
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) {
 | 
			
		||||
	if !w.compact && w.complete {
 | 
			
		||||
		w.writeIndent()
 | 
			
		||||
	}
 | 
			
		||||
	w.complete = false
 | 
			
		||||
 | 
			
		||||
	if fd.Kind() != protoreflect.GroupKind {
 | 
			
		||||
		w.buf = append(w.buf, fd.Name()...)
 | 
			
		||||
		w.WriteByte(':')
 | 
			
		||||
	} else {
 | 
			
		||||
		// Use message type name for group field name.
 | 
			
		||||
		w.buf = append(w.buf, fd.Message().Name()...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !w.compact {
 | 
			
		||||
		w.WriteByte(' ')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func requiresQuotes(u string) bool {
 | 
			
		||||
	// When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted.
 | 
			
		||||
	for _, ch := range u {
 | 
			
		||||
		switch {
 | 
			
		||||
		case ch == '.' || ch == '/' || ch == '_':
 | 
			
		||||
			continue
 | 
			
		||||
		case '0' <= ch && ch <= '9':
 | 
			
		||||
			continue
 | 
			
		||||
		case 'A' <= ch && ch <= 'Z':
 | 
			
		||||
			continue
 | 
			
		||||
		case 'a' <= ch && ch <= 'z':
 | 
			
		||||
			continue
 | 
			
		||||
		default:
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeProto3Any writes an expanded google.protobuf.Any message.
 | 
			
		||||
//
 | 
			
		||||
// It returns (false, nil) if sv value can't be unmarshaled (e.g. because
 | 
			
		||||
// required messages are not linked in).
 | 
			
		||||
//
 | 
			
		||||
// It returns (true, error) when sv was written in expanded format or an error
 | 
			
		||||
// was encountered.
 | 
			
		||||
func (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, error) {
 | 
			
		||||
	md := m.Descriptor()
 | 
			
		||||
	fdURL := md.Fields().ByName("type_url")
 | 
			
		||||
	fdVal := md.Fields().ByName("value")
 | 
			
		||||
 | 
			
		||||
	url := m.Get(fdURL).String()
 | 
			
		||||
	mt, err := protoregistry.GlobalTypes.FindMessageByURL(url)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b := m.Get(fdVal).Bytes()
 | 
			
		||||
	m2 := mt.New()
 | 
			
		||||
	if err := proto.Unmarshal(b, m2.Interface()); err != nil {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	w.Write([]byte("["))
 | 
			
		||||
	if requiresQuotes(url) {
 | 
			
		||||
		w.writeQuotedString(url)
 | 
			
		||||
	} else {
 | 
			
		||||
		w.Write([]byte(url))
 | 
			
		||||
	}
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		w.Write([]byte("]:<"))
 | 
			
		||||
	} else {
 | 
			
		||||
		w.Write([]byte("]: <\n"))
 | 
			
		||||
		w.indent++
 | 
			
		||||
	}
 | 
			
		||||
	if err := w.writeMessage(m2); err != nil {
 | 
			
		||||
		return true, err
 | 
			
		||||
	}
 | 
			
		||||
	if w.compact {
 | 
			
		||||
		w.Write([]byte("> "))
 | 
			
		||||
	} else {
 | 
			
		||||
		w.indent--
 | 
			
		||||
		w.Write([]byte(">\n"))
 | 
			
		||||
	}
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeMessage(m protoreflect.Message) error {
 | 
			
		||||
	md := m.Descriptor()
 | 
			
		||||
	if w.expandAny && md.FullName() == "google.protobuf.Any" {
 | 
			
		||||
		if canExpand, err := w.writeProto3Any(m); canExpand {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fds := md.Fields()
 | 
			
		||||
	for i := 0; i < fds.Len(); {
 | 
			
		||||
		fd := fds.Get(i)
 | 
			
		||||
		if od := fd.ContainingOneof(); od != nil {
 | 
			
		||||
			fd = m.WhichOneof(od)
 | 
			
		||||
			i += od.Fields().Len()
 | 
			
		||||
		} else {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if fd == nil || !m.Has(fd) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		switch {
 | 
			
		||||
		case fd.IsList():
 | 
			
		||||
			lv := m.Get(fd).List()
 | 
			
		||||
			for j := 0; j < lv.Len(); j++ {
 | 
			
		||||
				w.writeName(fd)
 | 
			
		||||
				v := lv.Get(j)
 | 
			
		||||
				if err := w.writeSingularValue(v, fd); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				w.WriteByte('\n')
 | 
			
		||||
			}
 | 
			
		||||
		case fd.IsMap():
 | 
			
		||||
			kfd := fd.MapKey()
 | 
			
		||||
			vfd := fd.MapValue()
 | 
			
		||||
			mv := m.Get(fd).Map()
 | 
			
		||||
 | 
			
		||||
			type entry struct{ key, val protoreflect.Value }
 | 
			
		||||
			var entries []entry
 | 
			
		||||
			mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool {
 | 
			
		||||
				entries = append(entries, entry{k.Value(), v})
 | 
			
		||||
				return true
 | 
			
		||||
			})
 | 
			
		||||
			sort.Slice(entries, func(i, j int) bool {
 | 
			
		||||
				switch kfd.Kind() {
 | 
			
		||||
				case protoreflect.BoolKind:
 | 
			
		||||
					return !entries[i].key.Bool() && entries[j].key.Bool()
 | 
			
		||||
				case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
 | 
			
		||||
					return entries[i].key.Int() < entries[j].key.Int()
 | 
			
		||||
				case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
 | 
			
		||||
					return entries[i].key.Uint() < entries[j].key.Uint()
 | 
			
		||||
				case protoreflect.StringKind:
 | 
			
		||||
					return entries[i].key.String() < entries[j].key.String()
 | 
			
		||||
				default:
 | 
			
		||||
					panic("invalid kind")
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
			for _, entry := range entries {
 | 
			
		||||
				w.writeName(fd)
 | 
			
		||||
				w.WriteByte('<')
 | 
			
		||||
				if !w.compact {
 | 
			
		||||
					w.WriteByte('\n')
 | 
			
		||||
				}
 | 
			
		||||
				w.indent++
 | 
			
		||||
				w.writeName(kfd)
 | 
			
		||||
				if err := w.writeSingularValue(entry.key, kfd); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				w.WriteByte('\n')
 | 
			
		||||
				w.writeName(vfd)
 | 
			
		||||
				if err := w.writeSingularValue(entry.val, vfd); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				w.WriteByte('\n')
 | 
			
		||||
				w.indent--
 | 
			
		||||
				w.WriteByte('>')
 | 
			
		||||
				w.WriteByte('\n')
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
			w.writeName(fd)
 | 
			
		||||
			if err := w.writeSingularValue(m.Get(fd), fd); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			w.WriteByte('\n')
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if b := m.GetUnknown(); len(b) > 0 {
 | 
			
		||||
		w.writeUnknownFields(b)
 | 
			
		||||
	}
 | 
			
		||||
	return w.writeExtensions(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) error {
 | 
			
		||||
	switch fd.Kind() {
 | 
			
		||||
	case protoreflect.FloatKind, protoreflect.DoubleKind:
 | 
			
		||||
		switch vf := v.Float(); {
 | 
			
		||||
		case math.IsInf(vf, +1):
 | 
			
		||||
			w.Write(posInf)
 | 
			
		||||
		case math.IsInf(vf, -1):
 | 
			
		||||
			w.Write(negInf)
 | 
			
		||||
		case math.IsNaN(vf):
 | 
			
		||||
			w.Write(nan)
 | 
			
		||||
		default:
 | 
			
		||||
			fmt.Fprint(w, v.Interface())
 | 
			
		||||
		}
 | 
			
		||||
	case protoreflect.StringKind:
 | 
			
		||||
		// NOTE: This does not validate UTF-8 for historical reasons.
 | 
			
		||||
		w.writeQuotedString(string(v.String()))
 | 
			
		||||
	case protoreflect.BytesKind:
 | 
			
		||||
		w.writeQuotedString(string(v.Bytes()))
 | 
			
		||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
			
		||||
		var bra, ket byte = '<', '>'
 | 
			
		||||
		if fd.Kind() == protoreflect.GroupKind {
 | 
			
		||||
			bra, ket = '{', '}'
 | 
			
		||||
		}
 | 
			
		||||
		w.WriteByte(bra)
 | 
			
		||||
		if !w.compact {
 | 
			
		||||
			w.WriteByte('\n')
 | 
			
		||||
		}
 | 
			
		||||
		w.indent++
 | 
			
		||||
		m := v.Message()
 | 
			
		||||
		if m2, ok := m.Interface().(encoding.TextMarshaler); ok {
 | 
			
		||||
			b, err := m2.MarshalText()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			w.Write(b)
 | 
			
		||||
		} else {
 | 
			
		||||
			w.writeMessage(m)
 | 
			
		||||
		}
 | 
			
		||||
		w.indent--
 | 
			
		||||
		w.WriteByte(ket)
 | 
			
		||||
	case protoreflect.EnumKind:
 | 
			
		||||
		if ev := fd.Enum().Values().ByNumber(v.Enum()); ev != nil {
 | 
			
		||||
			fmt.Fprint(w, ev.Name())
 | 
			
		||||
		} else {
 | 
			
		||||
			fmt.Fprint(w, v.Enum())
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Fprint(w, v.Interface())
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeQuotedString writes a quoted string in the protocol buffer text format.
 | 
			
		||||
func (w *textWriter) writeQuotedString(s string) {
 | 
			
		||||
	w.WriteByte('"')
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		switch c := s[i]; c {
 | 
			
		||||
		case '\n':
 | 
			
		||||
			w.buf = append(w.buf, `\n`...)
 | 
			
		||||
		case '\r':
 | 
			
		||||
			w.buf = append(w.buf, `\r`...)
 | 
			
		||||
		case '\t':
 | 
			
		||||
			w.buf = append(w.buf, `\t`...)
 | 
			
		||||
		case '"':
 | 
			
		||||
			w.buf = append(w.buf, `\"`...)
 | 
			
		||||
		case '\\':
 | 
			
		||||
			w.buf = append(w.buf, `\\`...)
 | 
			
		||||
		default:
 | 
			
		||||
			if isPrint := c >= 0x20 && c < 0x7f; isPrint {
 | 
			
		||||
				w.buf = append(w.buf, c)
 | 
			
		||||
			} else {
 | 
			
		||||
				w.buf = append(w.buf, fmt.Sprintf(`\%03o`, c)...)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	w.WriteByte('"')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeUnknownFields(b []byte) {
 | 
			
		||||
	if !w.compact {
 | 
			
		||||
		fmt.Fprintf(w, "/* %d unknown bytes */\n", len(b))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for len(b) > 0 {
 | 
			
		||||
		num, wtyp, n := protowire.ConsumeTag(b)
 | 
			
		||||
		if n < 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		b = b[n:]
 | 
			
		||||
 | 
			
		||||
		if wtyp == protowire.EndGroupType {
 | 
			
		||||
			w.indent--
 | 
			
		||||
			w.Write(endBraceNewline)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Fprint(w, num)
 | 
			
		||||
		if wtyp != protowire.StartGroupType {
 | 
			
		||||
			w.WriteByte(':')
 | 
			
		||||
		}
 | 
			
		||||
		if !w.compact || wtyp == protowire.StartGroupType {
 | 
			
		||||
			w.WriteByte(' ')
 | 
			
		||||
		}
 | 
			
		||||
		switch wtyp {
 | 
			
		||||
		case protowire.VarintType:
 | 
			
		||||
			v, n := protowire.ConsumeVarint(b)
 | 
			
		||||
			if n < 0 {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			b = b[n:]
 | 
			
		||||
			fmt.Fprint(w, v)
 | 
			
		||||
		case protowire.Fixed32Type:
 | 
			
		||||
			v, n := protowire.ConsumeFixed32(b)
 | 
			
		||||
			if n < 0 {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			b = b[n:]
 | 
			
		||||
			fmt.Fprint(w, v)
 | 
			
		||||
		case protowire.Fixed64Type:
 | 
			
		||||
			v, n := protowire.ConsumeFixed64(b)
 | 
			
		||||
			if n < 0 {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			b = b[n:]
 | 
			
		||||
			fmt.Fprint(w, v)
 | 
			
		||||
		case protowire.BytesType:
 | 
			
		||||
			v, n := protowire.ConsumeBytes(b)
 | 
			
		||||
			if n < 0 {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			b = b[n:]
 | 
			
		||||
			fmt.Fprintf(w, "%q", v)
 | 
			
		||||
		case protowire.StartGroupType:
 | 
			
		||||
			w.WriteByte('{')
 | 
			
		||||
			w.indent++
 | 
			
		||||
		default:
 | 
			
		||||
			fmt.Fprintf(w, "/* unknown wire type %d */", wtyp)
 | 
			
		||||
		}
 | 
			
		||||
		w.WriteByte('\n')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeExtensions writes all the extensions in m.
 | 
			
		||||
func (w *textWriter) writeExtensions(m protoreflect.Message) error {
 | 
			
		||||
	md := m.Descriptor()
 | 
			
		||||
	if md.ExtensionRanges().Len() == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type ext struct {
 | 
			
		||||
		desc protoreflect.FieldDescriptor
 | 
			
		||||
		val  protoreflect.Value
 | 
			
		||||
	}
 | 
			
		||||
	var exts []ext
 | 
			
		||||
	m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
			
		||||
		if fd.IsExtension() {
 | 
			
		||||
			exts = append(exts, ext{fd, v})
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
	sort.Slice(exts, func(i, j int) bool {
 | 
			
		||||
		return exts[i].desc.Number() < exts[j].desc.Number()
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	for _, ext := range exts {
 | 
			
		||||
		// For message set, use the name of the message as the extension name.
 | 
			
		||||
		name := string(ext.desc.FullName())
 | 
			
		||||
		if isMessageSet(ext.desc.ContainingMessage()) {
 | 
			
		||||
			name = strings.TrimSuffix(name, ".message_set_extension")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if !ext.desc.IsList() {
 | 
			
		||||
			if err := w.writeSingularExtension(name, ext.val, ext.desc); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			lv := ext.val.List()
 | 
			
		||||
			for i := 0; i < lv.Len(); i++ {
 | 
			
		||||
				if err := w.writeSingularExtension(name, lv.Get(i), ext.desc); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeSingularExtension(name string, v protoreflect.Value, fd protoreflect.FieldDescriptor) error {
 | 
			
		||||
	fmt.Fprintf(w, "[%s]:", name)
 | 
			
		||||
	if !w.compact {
 | 
			
		||||
		w.WriteByte(' ')
 | 
			
		||||
	}
 | 
			
		||||
	if err := w.writeSingularValue(v, fd); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	w.WriteByte('\n')
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *textWriter) writeIndent() {
 | 
			
		||||
	if !w.complete {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < w.indent*2; i++ {
 | 
			
		||||
		w.buf = append(w.buf, ' ')
 | 
			
		||||
	}
 | 
			
		||||
	w.complete = false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										880
									
								
								vendor/github.com/golang/protobuf/proto/text_parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										880
									
								
								vendor/github.com/golang/protobuf/proto/text_parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,880 +0,0 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2010 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
// Functions for parsing the Text protocol buffer format.
 | 
			
		||||
// TODO: message sets.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Error string emitted when deserializing Any and fields are already set
 | 
			
		||||
const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set"
 | 
			
		||||
 | 
			
		||||
type ParseError struct {
 | 
			
		||||
	Message string
 | 
			
		||||
	Line    int // 1-based line number
 | 
			
		||||
	Offset  int // 0-based byte offset from start of input
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *ParseError) Error() string {
 | 
			
		||||
	if p.Line == 1 {
 | 
			
		||||
		// show offset only for first line
 | 
			
		||||
		return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("line %d: %v", p.Line, p.Message)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type token struct {
 | 
			
		||||
	value    string
 | 
			
		||||
	err      *ParseError
 | 
			
		||||
	line     int    // line number
 | 
			
		||||
	offset   int    // byte number from start of input, not start of line
 | 
			
		||||
	unquoted string // the unquoted version of value, if it was a quoted string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *token) String() string {
 | 
			
		||||
	if t.err == nil {
 | 
			
		||||
		return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("parse error: %v", t.err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type textParser struct {
 | 
			
		||||
	s            string // remaining input
 | 
			
		||||
	done         bool   // whether the parsing is finished (success or error)
 | 
			
		||||
	backed       bool   // whether back() was called
 | 
			
		||||
	offset, line int
 | 
			
		||||
	cur          token
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newTextParser(s string) *textParser {
 | 
			
		||||
	p := new(textParser)
 | 
			
		||||
	p.s = s
 | 
			
		||||
	p.line = 1
 | 
			
		||||
	p.cur.line = 1
 | 
			
		||||
	return p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) errorf(format string, a ...interface{}) *ParseError {
 | 
			
		||||
	pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset}
 | 
			
		||||
	p.cur.err = pe
 | 
			
		||||
	p.done = true
 | 
			
		||||
	return pe
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Numbers and identifiers are matched by [-+._A-Za-z0-9]
 | 
			
		||||
func isIdentOrNumberChar(c byte) bool {
 | 
			
		||||
	switch {
 | 
			
		||||
	case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z':
 | 
			
		||||
		return true
 | 
			
		||||
	case '0' <= c && c <= '9':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	switch c {
 | 
			
		||||
	case '-', '+', '.', '_':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isWhitespace(c byte) bool {
 | 
			
		||||
	switch c {
 | 
			
		||||
	case ' ', '\t', '\n', '\r':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isQuote(c byte) bool {
 | 
			
		||||
	switch c {
 | 
			
		||||
	case '"', '\'':
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) skipWhitespace() {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {
 | 
			
		||||
		if p.s[i] == '#' {
 | 
			
		||||
			// comment; skip to end of line or input
 | 
			
		||||
			for i < len(p.s) && p.s[i] != '\n' {
 | 
			
		||||
				i++
 | 
			
		||||
			}
 | 
			
		||||
			if i == len(p.s) {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if p.s[i] == '\n' {
 | 
			
		||||
			p.line++
 | 
			
		||||
		}
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	p.offset += i
 | 
			
		||||
	p.s = p.s[i:len(p.s)]
 | 
			
		||||
	if len(p.s) == 0 {
 | 
			
		||||
		p.done = true
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) advance() {
 | 
			
		||||
	// Skip whitespace
 | 
			
		||||
	p.skipWhitespace()
 | 
			
		||||
	if p.done {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Start of non-whitespace
 | 
			
		||||
	p.cur.err = nil
 | 
			
		||||
	p.cur.offset, p.cur.line = p.offset, p.line
 | 
			
		||||
	p.cur.unquoted = ""
 | 
			
		||||
	switch p.s[0] {
 | 
			
		||||
	case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':
 | 
			
		||||
		// Single symbol
 | 
			
		||||
		p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]
 | 
			
		||||
	case '"', '\'':
 | 
			
		||||
		// Quoted string
 | 
			
		||||
		i := 1
 | 
			
		||||
		for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' {
 | 
			
		||||
			if p.s[i] == '\\' && i+1 < len(p.s) {
 | 
			
		||||
				// skip escaped char
 | 
			
		||||
				i++
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if i >= len(p.s) || p.s[i] != p.s[0] {
 | 
			
		||||
			p.errorf("unmatched quote")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		unq, err := unquoteC(p.s[1:i], rune(p.s[0]))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)]
 | 
			
		||||
		p.cur.unquoted = unq
 | 
			
		||||
	default:
 | 
			
		||||
		i := 0
 | 
			
		||||
		for i < len(p.s) && isIdentOrNumberChar(p.s[i]) {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if i == 0 {
 | 
			
		||||
			p.errorf("unexpected byte %#x", p.s[0])
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)]
 | 
			
		||||
	}
 | 
			
		||||
	p.offset += len(p.cur.value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	errBadUTF8 = errors.New("proto: bad UTF-8")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func unquoteC(s string, quote rune) (string, error) {
 | 
			
		||||
	// This is based on C++'s tokenizer.cc.
 | 
			
		||||
	// Despite its name, this is *not* parsing C syntax.
 | 
			
		||||
	// For instance, "\0" is an invalid quoted string.
 | 
			
		||||
 | 
			
		||||
	// Avoid allocation in trivial cases.
 | 
			
		||||
	simple := true
 | 
			
		||||
	for _, r := range s {
 | 
			
		||||
		if r == '\\' || r == quote {
 | 
			
		||||
			simple = false
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if simple {
 | 
			
		||||
		return s, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	buf := make([]byte, 0, 3*len(s)/2)
 | 
			
		||||
	for len(s) > 0 {
 | 
			
		||||
		r, n := utf8.DecodeRuneInString(s)
 | 
			
		||||
		if r == utf8.RuneError && n == 1 {
 | 
			
		||||
			return "", errBadUTF8
 | 
			
		||||
		}
 | 
			
		||||
		s = s[n:]
 | 
			
		||||
		if r != '\\' {
 | 
			
		||||
			if r < utf8.RuneSelf {
 | 
			
		||||
				buf = append(buf, byte(r))
 | 
			
		||||
			} else {
 | 
			
		||||
				buf = append(buf, string(r)...)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ch, tail, err := unescape(s)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		buf = append(buf, ch...)
 | 
			
		||||
		s = tail
 | 
			
		||||
	}
 | 
			
		||||
	return string(buf), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func unescape(s string) (ch string, tail string, err error) {
 | 
			
		||||
	r, n := utf8.DecodeRuneInString(s)
 | 
			
		||||
	if r == utf8.RuneError && n == 1 {
 | 
			
		||||
		return "", "", errBadUTF8
 | 
			
		||||
	}
 | 
			
		||||
	s = s[n:]
 | 
			
		||||
	switch r {
 | 
			
		||||
	case 'a':
 | 
			
		||||
		return "\a", s, nil
 | 
			
		||||
	case 'b':
 | 
			
		||||
		return "\b", s, nil
 | 
			
		||||
	case 'f':
 | 
			
		||||
		return "\f", s, nil
 | 
			
		||||
	case 'n':
 | 
			
		||||
		return "\n", s, nil
 | 
			
		||||
	case 'r':
 | 
			
		||||
		return "\r", s, nil
 | 
			
		||||
	case 't':
 | 
			
		||||
		return "\t", s, nil
 | 
			
		||||
	case 'v':
 | 
			
		||||
		return "\v", s, nil
 | 
			
		||||
	case '?':
 | 
			
		||||
		return "?", s, nil // trigraph workaround
 | 
			
		||||
	case '\'', '"', '\\':
 | 
			
		||||
		return string(r), s, nil
 | 
			
		||||
	case '0', '1', '2', '3', '4', '5', '6', '7':
 | 
			
		||||
		if len(s) < 2 {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c requires 2 following digits`, r)
 | 
			
		||||
		}
 | 
			
		||||
		ss := string(r) + s[:2]
 | 
			
		||||
		s = s[2:]
 | 
			
		||||
		i, err := strconv.ParseUint(ss, 8, 8)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss)
 | 
			
		||||
		}
 | 
			
		||||
		return string([]byte{byte(i)}), s, nil
 | 
			
		||||
	case 'x', 'X', 'u', 'U':
 | 
			
		||||
		var n int
 | 
			
		||||
		switch r {
 | 
			
		||||
		case 'x', 'X':
 | 
			
		||||
			n = 2
 | 
			
		||||
		case 'u':
 | 
			
		||||
			n = 4
 | 
			
		||||
		case 'U':
 | 
			
		||||
			n = 8
 | 
			
		||||
		}
 | 
			
		||||
		if len(s) < n {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n)
 | 
			
		||||
		}
 | 
			
		||||
		ss := s[:n]
 | 
			
		||||
		s = s[n:]
 | 
			
		||||
		i, err := strconv.ParseUint(ss, 16, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss)
 | 
			
		||||
		}
 | 
			
		||||
		if r == 'x' || r == 'X' {
 | 
			
		||||
			return string([]byte{byte(i)}), s, nil
 | 
			
		||||
		}
 | 
			
		||||
		if i > utf8.MaxRune {
 | 
			
		||||
			return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss)
 | 
			
		||||
		}
 | 
			
		||||
		return string(i), s, nil
 | 
			
		||||
	}
 | 
			
		||||
	return "", "", fmt.Errorf(`unknown escape \%c`, r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Back off the parser by one token. Can only be done between calls to next().
 | 
			
		||||
// It makes the next advance() a no-op.
 | 
			
		||||
func (p *textParser) back() { p.backed = true }
 | 
			
		||||
 | 
			
		||||
// Advances the parser and returns the new current token.
 | 
			
		||||
func (p *textParser) next() *token {
 | 
			
		||||
	if p.backed || p.done {
 | 
			
		||||
		p.backed = false
 | 
			
		||||
		return &p.cur
 | 
			
		||||
	}
 | 
			
		||||
	p.advance()
 | 
			
		||||
	if p.done {
 | 
			
		||||
		p.cur.value = ""
 | 
			
		||||
	} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {
 | 
			
		||||
		// Look for multiple quoted strings separated by whitespace,
 | 
			
		||||
		// and concatenate them.
 | 
			
		||||
		cat := p.cur
 | 
			
		||||
		for {
 | 
			
		||||
			p.skipWhitespace()
 | 
			
		||||
			if p.done || !isQuote(p.s[0]) {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			p.advance()
 | 
			
		||||
			if p.cur.err != nil {
 | 
			
		||||
				return &p.cur
 | 
			
		||||
			}
 | 
			
		||||
			cat.value += " " + p.cur.value
 | 
			
		||||
			cat.unquoted += p.cur.unquoted
 | 
			
		||||
		}
 | 
			
		||||
		p.done = false // parser may have seen EOF, but we want to return cat
 | 
			
		||||
		p.cur = cat
 | 
			
		||||
	}
 | 
			
		||||
	return &p.cur
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) consumeToken(s string) error {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != s {
 | 
			
		||||
		p.back()
 | 
			
		||||
		return p.errorf("expected %q, found %q", s, tok.value)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Return a RequiredNotSetError indicating which required field was not set.
 | 
			
		||||
func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError {
 | 
			
		||||
	st := sv.Type()
 | 
			
		||||
	sprops := GetProperties(st)
 | 
			
		||||
	for i := 0; i < st.NumField(); i++ {
 | 
			
		||||
		if !isNil(sv.Field(i)) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		props := sprops.Prop[i]
 | 
			
		||||
		if props.Required {
 | 
			
		||||
			return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &RequiredNotSetError{fmt.Sprintf("%v.<unknown field name>", st)} // should not happen
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns the index in the struct for the named field, as well as the parsed tag properties.
 | 
			
		||||
func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) {
 | 
			
		||||
	i, ok := sprops.decoderOrigNames[name]
 | 
			
		||||
	if ok {
 | 
			
		||||
		return i, sprops.Prop[i], true
 | 
			
		||||
	}
 | 
			
		||||
	return -1, nil, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Consume a ':' from the input stream (if the next token is a colon),
 | 
			
		||||
// returning an error if a colon is needed but not present.
 | 
			
		||||
func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != ":" {
 | 
			
		||||
		// Colon is optional when the field is a group or message.
 | 
			
		||||
		needColon := true
 | 
			
		||||
		switch props.Wire {
 | 
			
		||||
		case "group":
 | 
			
		||||
			needColon = false
 | 
			
		||||
		case "bytes":
 | 
			
		||||
			// A "bytes" field is either a message, a string, or a repeated field;
 | 
			
		||||
			// those three become *T, *string and []T respectively, so we can check for
 | 
			
		||||
			// this field being a pointer to a non-string.
 | 
			
		||||
			if typ.Kind() == reflect.Ptr {
 | 
			
		||||
				// *T or *string
 | 
			
		||||
				if typ.Elem().Kind() == reflect.String {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			} else if typ.Kind() == reflect.Slice {
 | 
			
		||||
				// []T or []*T
 | 
			
		||||
				if typ.Elem().Kind() != reflect.Ptr {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			} else if typ.Kind() == reflect.String {
 | 
			
		||||
				// The proto3 exception is for a string field,
 | 
			
		||||
				// which requires a colon.
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			needColon = false
 | 
			
		||||
		}
 | 
			
		||||
		if needColon {
 | 
			
		||||
			return p.errorf("expected ':', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
		p.back()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) readStruct(sv reflect.Value, terminator string) error {
 | 
			
		||||
	st := sv.Type()
 | 
			
		||||
	sprops := GetProperties(st)
 | 
			
		||||
	reqCount := sprops.reqCount
 | 
			
		||||
	var reqFieldErr error
 | 
			
		||||
	fieldSet := make(map[string]bool)
 | 
			
		||||
	// A struct is a sequence of "name: value", terminated by one of
 | 
			
		||||
	// '>' or '}', or the end of the input.  A name may also be
 | 
			
		||||
	// "[extension]" or "[type/url]".
 | 
			
		||||
	//
 | 
			
		||||
	// The whole struct can also be an expanded Any message, like:
 | 
			
		||||
	// [type/url] < ... struct contents ... >
 | 
			
		||||
	for {
 | 
			
		||||
		tok := p.next()
 | 
			
		||||
		if tok.err != nil {
 | 
			
		||||
			return tok.err
 | 
			
		||||
		}
 | 
			
		||||
		if tok.value == terminator {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if tok.value == "[" {
 | 
			
		||||
			// Looks like an extension or an Any.
 | 
			
		||||
			//
 | 
			
		||||
			// TODO: Check whether we need to handle
 | 
			
		||||
			// namespace rooted names (e.g. ".something.Foo").
 | 
			
		||||
			extName, err := p.consumeExtName()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if s := strings.LastIndex(extName, "/"); s >= 0 {
 | 
			
		||||
				// If it contains a slash, it's an Any type URL.
 | 
			
		||||
				messageName := extName[s+1:]
 | 
			
		||||
				mt := MessageType(messageName)
 | 
			
		||||
				if mt == nil {
 | 
			
		||||
					return p.errorf("unrecognized message %q in google.protobuf.Any", messageName)
 | 
			
		||||
				}
 | 
			
		||||
				tok = p.next()
 | 
			
		||||
				if tok.err != nil {
 | 
			
		||||
					return tok.err
 | 
			
		||||
				}
 | 
			
		||||
				// consume an optional colon
 | 
			
		||||
				if tok.value == ":" {
 | 
			
		||||
					tok = p.next()
 | 
			
		||||
					if tok.err != nil {
 | 
			
		||||
						return tok.err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				var terminator string
 | 
			
		||||
				switch tok.value {
 | 
			
		||||
				case "<":
 | 
			
		||||
					terminator = ">"
 | 
			
		||||
				case "{":
 | 
			
		||||
					terminator = "}"
 | 
			
		||||
				default:
 | 
			
		||||
					return p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
				}
 | 
			
		||||
				v := reflect.New(mt.Elem())
 | 
			
		||||
				if pe := p.readStruct(v.Elem(), terminator); pe != nil {
 | 
			
		||||
					return pe
 | 
			
		||||
				}
 | 
			
		||||
				b, err := Marshal(v.Interface().(Message))
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return p.errorf("failed to marshal message of type %q: %v", messageName, err)
 | 
			
		||||
				}
 | 
			
		||||
				if fieldSet["type_url"] {
 | 
			
		||||
					return p.errorf(anyRepeatedlyUnpacked, "type_url")
 | 
			
		||||
				}
 | 
			
		||||
				if fieldSet["value"] {
 | 
			
		||||
					return p.errorf(anyRepeatedlyUnpacked, "value")
 | 
			
		||||
				}
 | 
			
		||||
				sv.FieldByName("TypeUrl").SetString(extName)
 | 
			
		||||
				sv.FieldByName("Value").SetBytes(b)
 | 
			
		||||
				fieldSet["type_url"] = true
 | 
			
		||||
				fieldSet["value"] = true
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var desc *ExtensionDesc
 | 
			
		||||
			// This could be faster, but it's functional.
 | 
			
		||||
			// TODO: Do something smarter than a linear scan.
 | 
			
		||||
			for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) {
 | 
			
		||||
				if d.Name == extName {
 | 
			
		||||
					desc = d
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if desc == nil {
 | 
			
		||||
				return p.errorf("unrecognized extension %q", extName)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			props := &Properties{}
 | 
			
		||||
			props.Parse(desc.Tag)
 | 
			
		||||
 | 
			
		||||
			typ := reflect.TypeOf(desc.ExtensionType)
 | 
			
		||||
			if err := p.checkForColon(props, typ); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			rep := desc.repeated()
 | 
			
		||||
 | 
			
		||||
			// Read the extension structure, and set it in
 | 
			
		||||
			// the value we're constructing.
 | 
			
		||||
			var ext reflect.Value
 | 
			
		||||
			if !rep {
 | 
			
		||||
				ext = reflect.New(typ).Elem()
 | 
			
		||||
			} else {
 | 
			
		||||
				ext = reflect.New(typ.Elem()).Elem()
 | 
			
		||||
			}
 | 
			
		||||
			if err := p.readAny(ext, props); err != nil {
 | 
			
		||||
				if _, ok := err.(*RequiredNotSetError); !ok {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				reqFieldErr = err
 | 
			
		||||
			}
 | 
			
		||||
			ep := sv.Addr().Interface().(Message)
 | 
			
		||||
			if !rep {
 | 
			
		||||
				SetExtension(ep, desc, ext.Interface())
 | 
			
		||||
			} else {
 | 
			
		||||
				old, err := GetExtension(ep, desc)
 | 
			
		||||
				var sl reflect.Value
 | 
			
		||||
				if err == nil {
 | 
			
		||||
					sl = reflect.ValueOf(old) // existing slice
 | 
			
		||||
				} else {
 | 
			
		||||
					sl = reflect.MakeSlice(typ, 0, 1)
 | 
			
		||||
				}
 | 
			
		||||
				sl = reflect.Append(sl, ext)
 | 
			
		||||
				SetExtension(ep, desc, sl.Interface())
 | 
			
		||||
			}
 | 
			
		||||
			if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// This is a normal, non-extension field.
 | 
			
		||||
		name := tok.value
 | 
			
		||||
		var dst reflect.Value
 | 
			
		||||
		fi, props, ok := structFieldByName(sprops, name)
 | 
			
		||||
		if ok {
 | 
			
		||||
			dst = sv.Field(fi)
 | 
			
		||||
		} else if oop, ok := sprops.OneofTypes[name]; ok {
 | 
			
		||||
			// It is a oneof.
 | 
			
		||||
			props = oop.Prop
 | 
			
		||||
			nv := reflect.New(oop.Type.Elem())
 | 
			
		||||
			dst = nv.Elem().Field(0)
 | 
			
		||||
			field := sv.Field(oop.Field)
 | 
			
		||||
			if !field.IsNil() {
 | 
			
		||||
				return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name)
 | 
			
		||||
			}
 | 
			
		||||
			field.Set(nv)
 | 
			
		||||
		}
 | 
			
		||||
		if !dst.IsValid() {
 | 
			
		||||
			return p.errorf("unknown field name %q in %v", name, st)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if dst.Kind() == reflect.Map {
 | 
			
		||||
			// Consume any colon.
 | 
			
		||||
			if err := p.checkForColon(props, dst.Type()); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Construct the map if it doesn't already exist.
 | 
			
		||||
			if dst.IsNil() {
 | 
			
		||||
				dst.Set(reflect.MakeMap(dst.Type()))
 | 
			
		||||
			}
 | 
			
		||||
			key := reflect.New(dst.Type().Key()).Elem()
 | 
			
		||||
			val := reflect.New(dst.Type().Elem()).Elem()
 | 
			
		||||
 | 
			
		||||
			// The map entry should be this sequence of tokens:
 | 
			
		||||
			//	< key : KEY value : VALUE >
 | 
			
		||||
			// However, implementations may omit key or value, and technically
 | 
			
		||||
			// we should support them in any order.  See b/28924776 for a time
 | 
			
		||||
			// this went wrong.
 | 
			
		||||
 | 
			
		||||
			tok := p.next()
 | 
			
		||||
			var terminator string
 | 
			
		||||
			switch tok.value {
 | 
			
		||||
			case "<":
 | 
			
		||||
				terminator = ">"
 | 
			
		||||
			case "{":
 | 
			
		||||
				terminator = "}"
 | 
			
		||||
			default:
 | 
			
		||||
				return p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
			}
 | 
			
		||||
			for {
 | 
			
		||||
				tok := p.next()
 | 
			
		||||
				if tok.err != nil {
 | 
			
		||||
					return tok.err
 | 
			
		||||
				}
 | 
			
		||||
				if tok.value == terminator {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
				switch tok.value {
 | 
			
		||||
				case "key":
 | 
			
		||||
					if err := p.consumeToken(":"); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if err := p.readAny(key, props.MapKeyProp); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				case "value":
 | 
			
		||||
					if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if err := p.readAny(val, props.MapValProp); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
					if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
						return err
 | 
			
		||||
					}
 | 
			
		||||
				default:
 | 
			
		||||
					p.back()
 | 
			
		||||
					return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dst.SetMapIndex(key, val)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check that it's not already set if it's not a repeated field.
 | 
			
		||||
		if !props.Repeated && fieldSet[name] {
 | 
			
		||||
			return p.errorf("non-repeated field %q was repeated", name)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := p.checkForColon(props, dst.Type()); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Parse into the field.
 | 
			
		||||
		fieldSet[name] = true
 | 
			
		||||
		if err := p.readAny(dst, props); err != nil {
 | 
			
		||||
			if _, ok := err.(*RequiredNotSetError); !ok {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			reqFieldErr = err
 | 
			
		||||
		}
 | 
			
		||||
		if props.Required {
 | 
			
		||||
			reqCount--
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := p.consumeOptionalSeparator(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if reqCount > 0 {
 | 
			
		||||
		return p.missingRequiredFieldError(sv)
 | 
			
		||||
	}
 | 
			
		||||
	return reqFieldErr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeExtName consumes extension name or expanded Any type URL and the
 | 
			
		||||
// following ']'. It returns the name or URL consumed.
 | 
			
		||||
func (p *textParser) consumeExtName() (string, error) {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return "", tok.err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If extension name or type url is quoted, it's a single token.
 | 
			
		||||
	if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {
 | 
			
		||||
		name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		return name, p.consumeToken("]")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Consume everything up to "]"
 | 
			
		||||
	var parts []string
 | 
			
		||||
	for tok.value != "]" {
 | 
			
		||||
		parts = append(parts, tok.value)
 | 
			
		||||
		tok = p.next()
 | 
			
		||||
		if tok.err != nil {
 | 
			
		||||
			return "", p.errorf("unrecognized type_url or extension name: %s", tok.err)
 | 
			
		||||
		}
 | 
			
		||||
		if p.done && tok.value != "]" {
 | 
			
		||||
			return "", p.errorf("unclosed type_url or extension name")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(parts, ""), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeOptionalSeparator consumes an optional semicolon or comma.
 | 
			
		||||
// It is used in readStruct to provide backward compatibility.
 | 
			
		||||
func (p *textParser) consumeOptionalSeparator() error {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value != ";" && tok.value != "," {
 | 
			
		||||
		p.back()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *textParser) readAny(v reflect.Value, props *Properties) error {
 | 
			
		||||
	tok := p.next()
 | 
			
		||||
	if tok.err != nil {
 | 
			
		||||
		return tok.err
 | 
			
		||||
	}
 | 
			
		||||
	if tok.value == "" {
 | 
			
		||||
		return p.errorf("unexpected EOF")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch fv := v; fv.Kind() {
 | 
			
		||||
	case reflect.Slice:
 | 
			
		||||
		at := v.Type()
 | 
			
		||||
		if at.Elem().Kind() == reflect.Uint8 {
 | 
			
		||||
			// Special case for []byte
 | 
			
		||||
			if tok.value[0] != '"' && tok.value[0] != '\'' {
 | 
			
		||||
				// Deliberately written out here, as the error after
 | 
			
		||||
				// this switch statement would write "invalid []byte: ...",
 | 
			
		||||
				// which is not as user-friendly.
 | 
			
		||||
				return p.errorf("invalid string: %v", tok.value)
 | 
			
		||||
			}
 | 
			
		||||
			bytes := []byte(tok.unquoted)
 | 
			
		||||
			fv.Set(reflect.ValueOf(bytes))
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		// Repeated field.
 | 
			
		||||
		if tok.value == "[" {
 | 
			
		||||
			// Repeated field with list notation, like [1,2,3].
 | 
			
		||||
			for {
 | 
			
		||||
				fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem()))
 | 
			
		||||
				err := p.readAny(fv.Index(fv.Len()-1), props)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
				tok := p.next()
 | 
			
		||||
				if tok.err != nil {
 | 
			
		||||
					return tok.err
 | 
			
		||||
				}
 | 
			
		||||
				if tok.value == "]" {
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
				if tok.value != "," {
 | 
			
		||||
					return p.errorf("Expected ']' or ',' found %q", tok.value)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		// One value of the repeated field.
 | 
			
		||||
		p.back()
 | 
			
		||||
		fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem()))
 | 
			
		||||
		return p.readAny(fv.Index(fv.Len()-1), props)
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
		// true/1/t/True or false/f/0/False.
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "true", "1", "t", "True":
 | 
			
		||||
			fv.SetBool(true)
 | 
			
		||||
			return nil
 | 
			
		||||
		case "false", "0", "f", "False":
 | 
			
		||||
			fv.SetBool(false)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		v := tok.value
 | 
			
		||||
		// Ignore 'f' for compatibility with output generated by C++, but don't
 | 
			
		||||
		// remove 'f' when the value is "-inf" or "inf".
 | 
			
		||||
		if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" {
 | 
			
		||||
			v = v[:len(v)-1]
 | 
			
		||||
		}
 | 
			
		||||
		if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil {
 | 
			
		||||
			fv.SetFloat(f)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Int32:
 | 
			
		||||
		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
 | 
			
		||||
			fv.SetInt(x)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if len(props.Enum) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		m, ok := enumValueMaps[props.Enum]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		x, ok := m[tok.value]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		fv.SetInt(int64(x))
 | 
			
		||||
		return nil
 | 
			
		||||
	case reflect.Int64:
 | 
			
		||||
		if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil {
 | 
			
		||||
			fv.SetInt(x)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case reflect.Ptr:
 | 
			
		||||
		// A basic field (indirected through pointer), or a repeated message/group
 | 
			
		||||
		p.back()
 | 
			
		||||
		fv.Set(reflect.New(fv.Type().Elem()))
 | 
			
		||||
		return p.readAny(fv.Elem(), props)
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
		if tok.value[0] == '"' || tok.value[0] == '\'' {
 | 
			
		||||
			fv.SetString(tok.unquoted)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		var terminator string
 | 
			
		||||
		switch tok.value {
 | 
			
		||||
		case "{":
 | 
			
		||||
			terminator = "}"
 | 
			
		||||
		case "<":
 | 
			
		||||
			terminator = ">"
 | 
			
		||||
		default:
 | 
			
		||||
			return p.errorf("expected '{' or '<', found %q", tok.value)
 | 
			
		||||
		}
 | 
			
		||||
		// TODO: Handle nested messages which implement encoding.TextUnmarshaler.
 | 
			
		||||
		return p.readStruct(fv, terminator)
 | 
			
		||||
	case reflect.Uint32:
 | 
			
		||||
		if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
 | 
			
		||||
			fv.SetUint(uint64(x))
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Uint64:
 | 
			
		||||
		if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
 | 
			
		||||
			fv.SetUint(x)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return p.errorf("invalid %v: %v", v.Type(), tok.value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb
 | 
			
		||||
// before starting to unmarshal, so any existing data in pb is always removed.
 | 
			
		||||
// If a required field is not set and no other error occurs,
 | 
			
		||||
// UnmarshalText returns *RequiredNotSetError.
 | 
			
		||||
func UnmarshalText(s string, pb Message) error {
 | 
			
		||||
	if um, ok := pb.(encoding.TextUnmarshaler); ok {
 | 
			
		||||
		return um.UnmarshalText([]byte(s))
 | 
			
		||||
	}
 | 
			
		||||
	pb.Reset()
 | 
			
		||||
	v := reflect.ValueOf(pb)
 | 
			
		||||
	return newTextParser(s).readStruct(v.Elem(), "")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
			
		||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Size returns the size in bytes of the wire-format encoding of m.
 | 
			
		||||
func Size(m Message) int {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	mi := MessageV2(m)
 | 
			
		||||
	return protoV2.Size(mi)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Marshal returns the wire-format encoding of m.
 | 
			
		||||
func Marshal(m Message) ([]byte, error) {
 | 
			
		||||
	b, err := marshalAppend(nil, m, false)
 | 
			
		||||
	if b == nil {
 | 
			
		||||
		b = zeroBytes
 | 
			
		||||
	}
 | 
			
		||||
	return b, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var zeroBytes = make([]byte, 0, 0)
 | 
			
		||||
 | 
			
		||||
func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) {
 | 
			
		||||
	if m == nil {
 | 
			
		||||
		return nil, ErrNil
 | 
			
		||||
	}
 | 
			
		||||
	mi := MessageV2(m)
 | 
			
		||||
	nbuf, err := protoV2.MarshalOptions{
 | 
			
		||||
		Deterministic: deterministic,
 | 
			
		||||
		AllowPartial:  true,
 | 
			
		||||
	}.MarshalAppend(buf, mi)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return buf, err
 | 
			
		||||
	}
 | 
			
		||||
	if len(buf) == len(nbuf) {
 | 
			
		||||
		if !mi.ProtoReflect().IsValid() {
 | 
			
		||||
			return buf, ErrNil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nbuf, checkRequiredNotSet(mi)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmarshal parses a wire-format message in b and places the decoded results in m.
 | 
			
		||||
//
 | 
			
		||||
// Unmarshal resets m before starting to unmarshal, so any existing data in m is always
 | 
			
		||||
// removed. Use UnmarshalMerge to preserve and append to existing data.
 | 
			
		||||
func Unmarshal(b []byte, m Message) error {
 | 
			
		||||
	m.Reset()
 | 
			
		||||
	return UnmarshalMerge(b, m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalMerge parses a wire-format message in b and places the decoded results in m.
 | 
			
		||||
func UnmarshalMerge(b []byte, m Message) error {
 | 
			
		||||
	mi := MessageV2(m)
 | 
			
		||||
	out, err := protoV2.UnmarshalOptions{
 | 
			
		||||
		AllowPartial: true,
 | 
			
		||||
		Merge:        true,
 | 
			
		||||
	}.UnmarshalState(protoiface.UnmarshalInput{
 | 
			
		||||
		Buf:     b,
 | 
			
		||||
		Message: mi.ProtoReflect(),
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if out.Flags&protoiface.UnmarshalInitialized > 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return checkRequiredNotSet(mi)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								vendor/github.com/golang/protobuf/proto/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/golang/protobuf/proto/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package proto
 | 
			
		||||
 | 
			
		||||
// Bool stores v in a new bool value and returns a pointer to it.
 | 
			
		||||
func Bool(v bool) *bool { return &v }
 | 
			
		||||
 | 
			
		||||
// Int stores v in a new int32 value and returns a pointer to it.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: Use Int32 instead.
 | 
			
		||||
func Int(v int) *int32 { return Int32(int32(v)) }
 | 
			
		||||
 | 
			
		||||
// Int32 stores v in a new int32 value and returns a pointer to it.
 | 
			
		||||
func Int32(v int32) *int32 { return &v }
 | 
			
		||||
 | 
			
		||||
// Int64 stores v in a new int64 value and returns a pointer to it.
 | 
			
		||||
func Int64(v int64) *int64 { return &v }
 | 
			
		||||
 | 
			
		||||
// Uint32 stores v in a new uint32 value and returns a pointer to it.
 | 
			
		||||
func Uint32(v uint32) *uint32 { return &v }
 | 
			
		||||
 | 
			
		||||
// Uint64 stores v in a new uint64 value and returns a pointer to it.
 | 
			
		||||
func Uint64(v uint64) *uint64 { return &v }
 | 
			
		||||
 | 
			
		||||
// Float32 stores v in a new float32 value and returns a pointer to it.
 | 
			
		||||
func Float32(v float32) *float32 { return &v }
 | 
			
		||||
 | 
			
		||||
// Float64 stores v in a new float64 value and returns a pointer to it.
 | 
			
		||||
func Float64(v float64) *float64 { return &v }
 | 
			
		||||
 | 
			
		||||
// String stores v in a new string value and returns a pointer to it.
 | 
			
		||||
func String(v string) *string { return &v }
 | 
			
		||||
							
								
								
									
										214
									
								
								vendor/github.com/golang/protobuf/ptypes/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										214
									
								
								vendor/github.com/golang/protobuf/ptypes/any.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,141 +1,165 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package ptypes
 | 
			
		||||
 | 
			
		||||
// This file implements functions to marshal proto.Message to/from
 | 
			
		||||
// google.protobuf.Any message.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/golang/protobuf/proto"
 | 
			
		||||
	"github.com/golang/protobuf/ptypes/any"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
			
		||||
 | 
			
		||||
	anypb "github.com/golang/protobuf/ptypes/any"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const googleApis = "type.googleapis.com/"
 | 
			
		||||
const urlPrefix = "type.googleapis.com/"
 | 
			
		||||
 | 
			
		||||
// AnyMessageName returns the name of the message contained in a google.protobuf.Any message.
 | 
			
		||||
//
 | 
			
		||||
// Note that regular type assertions should be done using the Is
 | 
			
		||||
// function. AnyMessageName is provided for less common use cases like filtering a
 | 
			
		||||
// sequence of Any messages based on a set of allowed message type names.
 | 
			
		||||
func AnyMessageName(any *any.Any) (string, error) {
 | 
			
		||||
// AnyMessageName returns the message name contained in an anypb.Any message.
 | 
			
		||||
// Most type assertions should use the Is function instead.
 | 
			
		||||
func AnyMessageName(any *anypb.Any) (string, error) {
 | 
			
		||||
	name, err := anyMessageName(any)
 | 
			
		||||
	return string(name), err
 | 
			
		||||
}
 | 
			
		||||
func anyMessageName(any *anypb.Any) (protoreflect.FullName, error) {
 | 
			
		||||
	if any == nil {
 | 
			
		||||
		return "", fmt.Errorf("message is nil")
 | 
			
		||||
	}
 | 
			
		||||
	slash := strings.LastIndex(any.TypeUrl, "/")
 | 
			
		||||
	if slash < 0 {
 | 
			
		||||
	name := protoreflect.FullName(any.TypeUrl)
 | 
			
		||||
	if i := strings.LastIndex(any.TypeUrl, "/"); i >= 0 {
 | 
			
		||||
		name = name[i+len("/"):]
 | 
			
		||||
	}
 | 
			
		||||
	if !name.IsValid() {
 | 
			
		||||
		return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl)
 | 
			
		||||
	}
 | 
			
		||||
	return any.TypeUrl[slash+1:], nil
 | 
			
		||||
	return name, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any.
 | 
			
		||||
func MarshalAny(pb proto.Message) (*any.Any, error) {
 | 
			
		||||
	value, err := proto.Marshal(pb)
 | 
			
		||||
// MarshalAny marshals the given message m into an anypb.Any message.
 | 
			
		||||
func MarshalAny(m proto.Message) (*anypb.Any, error) {
 | 
			
		||||
	switch dm := m.(type) {
 | 
			
		||||
	case DynamicAny:
 | 
			
		||||
		m = dm.Message
 | 
			
		||||
	case *DynamicAny:
 | 
			
		||||
		if dm == nil {
 | 
			
		||||
			return nil, proto.ErrNil
 | 
			
		||||
		}
 | 
			
		||||
		m = dm.Message
 | 
			
		||||
	}
 | 
			
		||||
	b, err := proto.Marshal(m)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil
 | 
			
		||||
	return &anypb.Any{TypeUrl: urlPrefix + proto.MessageName(m), Value: b}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DynamicAny is a value that can be passed to UnmarshalAny to automatically
 | 
			
		||||
// allocate a proto.Message for the type specified in a google.protobuf.Any
 | 
			
		||||
// message. The allocated message is stored in the embedded proto.Message.
 | 
			
		||||
//
 | 
			
		||||
// Example:
 | 
			
		||||
//
 | 
			
		||||
//   var x ptypes.DynamicAny
 | 
			
		||||
//   if err := ptypes.UnmarshalAny(a, &x); err != nil { ... }
 | 
			
		||||
//   fmt.Printf("unmarshaled message: %v", x.Message)
 | 
			
		||||
type DynamicAny struct {
 | 
			
		||||
	proto.Message
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Empty returns a new proto.Message of the type specified in a
 | 
			
		||||
// google.protobuf.Any message. It returns an error if corresponding message
 | 
			
		||||
// type isn't linked in.
 | 
			
		||||
func Empty(any *any.Any) (proto.Message, error) {
 | 
			
		||||
	aname, err := AnyMessageName(any)
 | 
			
		||||
// Empty returns a new message of the type specified in an anypb.Any message.
 | 
			
		||||
// It returns protoregistry.NotFound if the corresponding message type could not
 | 
			
		||||
// be resolved in the global registry.
 | 
			
		||||
func Empty(any *anypb.Any) (proto.Message, error) {
 | 
			
		||||
	name, err := anyMessageName(any)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t := proto.MessageType(aname)
 | 
			
		||||
	if t == nil {
 | 
			
		||||
		return nil, fmt.Errorf("any: message type %q isn't linked in", aname)
 | 
			
		||||
	mt, err := protoregistry.GlobalTypes.FindMessageByName(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return reflect.New(t.Elem()).Interface().(proto.Message), nil
 | 
			
		||||
	return proto.MessageV1(mt.New().Interface()), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any
 | 
			
		||||
// message and places the decoded result in pb. It returns an error if type of
 | 
			
		||||
// contents of Any message does not match type of pb message.
 | 
			
		||||
// UnmarshalAny unmarshals the encoded value contained in the anypb.Any message
 | 
			
		||||
// into the provided message m. It returns an error if the target message
 | 
			
		||||
// does not match the type in the Any message or if an unmarshal error occurs.
 | 
			
		||||
//
 | 
			
		||||
// pb can be a proto.Message, or a *DynamicAny.
 | 
			
		||||
func UnmarshalAny(any *any.Any, pb proto.Message) error {
 | 
			
		||||
	if d, ok := pb.(*DynamicAny); ok {
 | 
			
		||||
		if d.Message == nil {
 | 
			
		||||
// The target message m may be a *DynamicAny message. If the underlying message
 | 
			
		||||
// type could not be resolved, then this returns protoregistry.NotFound.
 | 
			
		||||
func UnmarshalAny(any *anypb.Any, m proto.Message) error {
 | 
			
		||||
	if dm, ok := m.(*DynamicAny); ok {
 | 
			
		||||
		if dm.Message == nil {
 | 
			
		||||
			var err error
 | 
			
		||||
			d.Message, err = Empty(any)
 | 
			
		||||
			dm.Message, err = Empty(any)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return UnmarshalAny(any, d.Message)
 | 
			
		||||
		m = dm.Message
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	aname, err := AnyMessageName(any)
 | 
			
		||||
	anyName, err := AnyMessageName(any)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mname := proto.MessageName(pb)
 | 
			
		||||
	if aname != mname {
 | 
			
		||||
		return fmt.Errorf("mismatched message type: got %q want %q", aname, mname)
 | 
			
		||||
	msgName := proto.MessageName(m)
 | 
			
		||||
	if anyName != msgName {
 | 
			
		||||
		return fmt.Errorf("mismatched message type: got %q want %q", anyName, msgName)
 | 
			
		||||
	}
 | 
			
		||||
	return proto.Unmarshal(any.Value, pb)
 | 
			
		||||
	return proto.Unmarshal(any.Value, m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Is returns true if any value contains a given message type.
 | 
			
		||||
func Is(any *any.Any, pb proto.Message) bool {
 | 
			
		||||
	// The following is equivalent to AnyMessageName(any) == proto.MessageName(pb),
 | 
			
		||||
	// but it avoids scanning TypeUrl for the slash.
 | 
			
		||||
	if any == nil {
 | 
			
		||||
// Is reports whether the Any message contains a message of the specified type.
 | 
			
		||||
func Is(any *anypb.Any, m proto.Message) bool {
 | 
			
		||||
	if any == nil || m == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	name := proto.MessageName(pb)
 | 
			
		||||
	prefix := len(any.TypeUrl) - len(name)
 | 
			
		||||
	return prefix >= 1 && any.TypeUrl[prefix-1] == '/' && any.TypeUrl[prefix:] == name
 | 
			
		||||
	name := proto.MessageName(m)
 | 
			
		||||
	if !strings.HasSuffix(any.TypeUrl, name) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return len(any.TypeUrl) == len(name) || any.TypeUrl[len(any.TypeUrl)-len(name)-1] == '/'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DynamicAny is a value that can be passed to UnmarshalAny to automatically
 | 
			
		||||
// allocate a proto.Message for the type specified in an anypb.Any message.
 | 
			
		||||
// The allocated message is stored in the embedded proto.Message.
 | 
			
		||||
//
 | 
			
		||||
// Example:
 | 
			
		||||
//   var x ptypes.DynamicAny
 | 
			
		||||
//   if err := ptypes.UnmarshalAny(a, &x); err != nil { ... }
 | 
			
		||||
//   fmt.Printf("unmarshaled message: %v", x.Message)
 | 
			
		||||
type DynamicAny struct{ proto.Message }
 | 
			
		||||
 | 
			
		||||
func (m DynamicAny) String() string {
 | 
			
		||||
	if m.Message == nil {
 | 
			
		||||
		return "<nil>"
 | 
			
		||||
	}
 | 
			
		||||
	return m.Message.String()
 | 
			
		||||
}
 | 
			
		||||
func (m DynamicAny) Reset() {
 | 
			
		||||
	if m.Message == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	m.Message.Reset()
 | 
			
		||||
}
 | 
			
		||||
func (m DynamicAny) ProtoMessage() {
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
func (m DynamicAny) ProtoReflect() protoreflect.Message {
 | 
			
		||||
	if m.Message == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	return dynamicAny{proto.MessageReflect(m.Message)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type dynamicAny struct{ protoreflect.Message }
 | 
			
		||||
 | 
			
		||||
func (m dynamicAny) Type() protoreflect.MessageType {
 | 
			
		||||
	return dynamicAnyType{m.Message.Type()}
 | 
			
		||||
}
 | 
			
		||||
func (m dynamicAny) New() protoreflect.Message {
 | 
			
		||||
	return dynamicAnyType{m.Message.Type()}.New()
 | 
			
		||||
}
 | 
			
		||||
func (m dynamicAny) Interface() protoreflect.ProtoMessage {
 | 
			
		||||
	return DynamicAny{proto.MessageV1(m.Message.Interface())}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type dynamicAnyType struct{ protoreflect.MessageType }
 | 
			
		||||
 | 
			
		||||
func (t dynamicAnyType) New() protoreflect.Message {
 | 
			
		||||
	return dynamicAny{t.MessageType.New()}
 | 
			
		||||
}
 | 
			
		||||
func (t dynamicAnyType) Zero() protoreflect.Message {
 | 
			
		||||
	return dynamicAny{t.MessageType.Zero()}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										232
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										232
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,200 +1,62 @@
 | 
			
		|||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/any.proto
 | 
			
		||||
// source: github.com/golang/protobuf/ptypes/any/any.proto
 | 
			
		||||
 | 
			
		||||
package any
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	math "math"
 | 
			
		||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
	anypb "google.golang.org/protobuf/types/known/anypb"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
// Symbols defined in public import of google/protobuf/any.proto.
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
type Any = anypb.Any
 | 
			
		||||
 | 
			
		||||
// `Any` contains an arbitrary serialized protocol buffer message along with a
 | 
			
		||||
// URL that describes the type of the serialized message.
 | 
			
		||||
//
 | 
			
		||||
// Protobuf library provides support to pack/unpack Any values in the form
 | 
			
		||||
// of utility functions or additional generated methods of the Any type.
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Pack and unpack a message in C++.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any;
 | 
			
		||||
//     any.PackFrom(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.UnpackTo(&foo)) {
 | 
			
		||||
//       ...
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Pack and unpack a message in Java.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any = Any.pack(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.is(Foo.class)) {
 | 
			
		||||
//       foo = any.unpack(Foo.class);
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//  Example 3: Pack and unpack a message in Python.
 | 
			
		||||
//
 | 
			
		||||
//     foo = Foo(...)
 | 
			
		||||
//     any = Any()
 | 
			
		||||
//     any.Pack(foo)
 | 
			
		||||
//     ...
 | 
			
		||||
//     if any.Is(Foo.DESCRIPTOR):
 | 
			
		||||
//       any.Unpack(foo)
 | 
			
		||||
//       ...
 | 
			
		||||
//
 | 
			
		||||
//  Example 4: Pack and unpack a message in Go
 | 
			
		||||
//
 | 
			
		||||
//      foo := &pb.Foo{...}
 | 
			
		||||
//      any, err := ptypes.MarshalAny(foo)
 | 
			
		||||
//      ...
 | 
			
		||||
//      foo := &pb.Foo{}
 | 
			
		||||
//      if err := ptypes.UnmarshalAny(any, foo); err != nil {
 | 
			
		||||
//        ...
 | 
			
		||||
//      }
 | 
			
		||||
//
 | 
			
		||||
// The pack methods provided by protobuf library will by default use
 | 
			
		||||
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
 | 
			
		||||
// methods only use the fully qualified type name after the last '/'
 | 
			
		||||
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
 | 
			
		||||
// name "y.z".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// JSON
 | 
			
		||||
// ====
 | 
			
		||||
// The JSON representation of an `Any` value uses the regular
 | 
			
		||||
// representation of the deserialized, embedded message, with an
 | 
			
		||||
// additional field `@type` which contains the type URL. Example:
 | 
			
		||||
//
 | 
			
		||||
//     package google.profile;
 | 
			
		||||
//     message Person {
 | 
			
		||||
//       string first_name = 1;
 | 
			
		||||
//       string last_name = 2;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.profile.Person",
 | 
			
		||||
//       "firstName": <string>,
 | 
			
		||||
//       "lastName": <string>
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// If the embedded message type is well-known and has a custom JSON
 | 
			
		||||
// representation, that representation will be embedded adding a field
 | 
			
		||||
// `value` which holds the custom JSON in addition to the `@type`
 | 
			
		||||
// field. Example (for message [google.protobuf.Duration][]):
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.protobuf.Duration",
 | 
			
		||||
//       "value": "1.212s"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
type Any struct {
 | 
			
		||||
	// A URL/resource name that uniquely identifies the type of the serialized
 | 
			
		||||
	// protocol buffer message. The last segment of the URL's path must represent
 | 
			
		||||
	// the fully qualified name of the type (as in
 | 
			
		||||
	// `path/google.protobuf.Duration`). The name should be in a canonical form
 | 
			
		||||
	// (e.g., leading "." is not accepted).
 | 
			
		||||
	//
 | 
			
		||||
	// In practice, teams usually precompile into the binary all types that they
 | 
			
		||||
	// expect it to use in the context of Any. However, for URLs which use the
 | 
			
		||||
	// scheme `http`, `https`, or no scheme, one can optionally set up a type
 | 
			
		||||
	// server that maps type URLs to message definitions as follows:
 | 
			
		||||
	//
 | 
			
		||||
	// * If no scheme is provided, `https` is assumed.
 | 
			
		||||
	// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
 | 
			
		||||
	//   value in binary format, or produce an error.
 | 
			
		||||
	// * Applications are allowed to cache lookup results based on the
 | 
			
		||||
	//   URL, or have them precompiled into a binary to avoid any
 | 
			
		||||
	//   lookup. Therefore, binary compatibility needs to be preserved
 | 
			
		||||
	//   on changes to types. (Use versioned type names to manage
 | 
			
		||||
	//   breaking changes.)
 | 
			
		||||
	//
 | 
			
		||||
	// Note: this functionality is not currently available in the official
 | 
			
		||||
	// protobuf release, and it is not used for type URLs beginning with
 | 
			
		||||
	// type.googleapis.com.
 | 
			
		||||
	//
 | 
			
		||||
	// Schemes other than `http`, `https` (or the empty scheme) might be
 | 
			
		||||
	// used with implementation specific semantics.
 | 
			
		||||
	//
 | 
			
		||||
	TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"`
 | 
			
		||||
	// Must be a valid serialized protocol buffer of the above specified type.
 | 
			
		||||
	Value                []byte   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
var File_github_com_golang_protobuf_ptypes_any_any_proto protoreflect.FileDescriptor
 | 
			
		||||
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc = []byte{
 | 
			
		||||
	0x0a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
 | 
			
		||||
	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
 | 
			
		||||
	0x70, 0x65, 0x73, 0x2f, 0x61, 0x6e, 0x79, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,
 | 
			
		||||
	0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
 | 
			
		||||
	0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x2b, 0x5a, 0x29,
 | 
			
		||||
	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e,
 | 
			
		||||
	0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65,
 | 
			
		||||
	0x73, 0x2f, 0x61, 0x6e, 0x79, 0x3b, 0x61, 0x6e, 0x79, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f,
 | 
			
		||||
	0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) Reset()         { *m = Any{} }
 | 
			
		||||
func (m *Any) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*Any) ProtoMessage()    {}
 | 
			
		||||
func (*Any) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_b53526c13ae22eb4, []int{0}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes = []interface{}{}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs = []int32{
 | 
			
		||||
	0, // [0:0] is the sub-list for method output_type
 | 
			
		||||
	0, // [0:0] is the sub-list for method input_type
 | 
			
		||||
	0, // [0:0] is the sub-list for extension type_name
 | 
			
		||||
	0, // [0:0] is the sub-list for extension extendee
 | 
			
		||||
	0, // [0:0] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Any) XXX_WellKnownType() string { return "Any" }
 | 
			
		||||
 | 
			
		||||
func (m *Any) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_Any.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_Any.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Any.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_Any.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *Any) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Any.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Any proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Any) GetTypeUrl() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.TypeUrl
 | 
			
		||||
func init() { file_github_com_golang_protobuf_ptypes_any_any_proto_init() }
 | 
			
		||||
func file_github_com_golang_protobuf_ptypes_any_any_proto_init() {
 | 
			
		||||
	if File_github_com_golang_protobuf_ptypes_any_any_proto != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Any) GetValue() []byte {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Value
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Any)(nil), "google.protobuf.Any")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_b53526c13ae22eb4) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_b53526c13ae22eb4 = []byte{
 | 
			
		||||
	// 185 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4,
 | 
			
		||||
	0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a,
 | 
			
		||||
	0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46,
 | 
			
		||||
	0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7,
 | 
			
		||||
	0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce,
 | 
			
		||||
	0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52,
 | 
			
		||||
	0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc,
 | 
			
		||||
	0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c,
 | 
			
		||||
	0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce,
 | 
			
		||||
	0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff,
 | 
			
		||||
	0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00,
 | 
			
		||||
	type x struct{}
 | 
			
		||||
	out := protoimpl.TypeBuilder{
 | 
			
		||||
		File: protoimpl.DescBuilder{
 | 
			
		||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
			
		||||
			RawDescriptor: file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc,
 | 
			
		||||
			NumEnums:      0,
 | 
			
		||||
			NumMessages:   0,
 | 
			
		||||
			NumExtensions: 0,
 | 
			
		||||
			NumServices:   0,
 | 
			
		||||
		},
 | 
			
		||||
		GoTypes:           file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes,
 | 
			
		||||
		DependencyIndexes: file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs,
 | 
			
		||||
	}.Build()
 | 
			
		||||
	File_github_com_golang_protobuf_ptypes_any_any_proto = out.File
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_any_any_proto_rawDesc = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_any_any_proto_goTypes = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_any_any_proto_depIdxs = nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										154
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										154
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,154 +0,0 @@
 | 
			
		|||
// Protocol Buffers - Google's data interchange format
 | 
			
		||||
// Copyright 2008 Google Inc.  All rights reserved.
 | 
			
		||||
// https://developers.google.com/protocol-buffers/
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package google.protobuf;
 | 
			
		||||
 | 
			
		||||
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
 | 
			
		||||
option go_package = "github.com/golang/protobuf/ptypes/any";
 | 
			
		||||
option java_package = "com.google.protobuf";
 | 
			
		||||
option java_outer_classname = "AnyProto";
 | 
			
		||||
option java_multiple_files = true;
 | 
			
		||||
option objc_class_prefix = "GPB";
 | 
			
		||||
 | 
			
		||||
// `Any` contains an arbitrary serialized protocol buffer message along with a
 | 
			
		||||
// URL that describes the type of the serialized message.
 | 
			
		||||
//
 | 
			
		||||
// Protobuf library provides support to pack/unpack Any values in the form
 | 
			
		||||
// of utility functions or additional generated methods of the Any type.
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Pack and unpack a message in C++.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any;
 | 
			
		||||
//     any.PackFrom(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.UnpackTo(&foo)) {
 | 
			
		||||
//       ...
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Pack and unpack a message in Java.
 | 
			
		||||
//
 | 
			
		||||
//     Foo foo = ...;
 | 
			
		||||
//     Any any = Any.pack(foo);
 | 
			
		||||
//     ...
 | 
			
		||||
//     if (any.is(Foo.class)) {
 | 
			
		||||
//       foo = any.unpack(Foo.class);
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//  Example 3: Pack and unpack a message in Python.
 | 
			
		||||
//
 | 
			
		||||
//     foo = Foo(...)
 | 
			
		||||
//     any = Any()
 | 
			
		||||
//     any.Pack(foo)
 | 
			
		||||
//     ...
 | 
			
		||||
//     if any.Is(Foo.DESCRIPTOR):
 | 
			
		||||
//       any.Unpack(foo)
 | 
			
		||||
//       ...
 | 
			
		||||
//
 | 
			
		||||
//  Example 4: Pack and unpack a message in Go
 | 
			
		||||
//
 | 
			
		||||
//      foo := &pb.Foo{...}
 | 
			
		||||
//      any, err := ptypes.MarshalAny(foo)
 | 
			
		||||
//      ...
 | 
			
		||||
//      foo := &pb.Foo{}
 | 
			
		||||
//      if err := ptypes.UnmarshalAny(any, foo); err != nil {
 | 
			
		||||
//        ...
 | 
			
		||||
//      }
 | 
			
		||||
//
 | 
			
		||||
// The pack methods provided by protobuf library will by default use
 | 
			
		||||
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
 | 
			
		||||
// methods only use the fully qualified type name after the last '/'
 | 
			
		||||
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
 | 
			
		||||
// name "y.z".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// JSON
 | 
			
		||||
// ====
 | 
			
		||||
// The JSON representation of an `Any` value uses the regular
 | 
			
		||||
// representation of the deserialized, embedded message, with an
 | 
			
		||||
// additional field `@type` which contains the type URL. Example:
 | 
			
		||||
//
 | 
			
		||||
//     package google.profile;
 | 
			
		||||
//     message Person {
 | 
			
		||||
//       string first_name = 1;
 | 
			
		||||
//       string last_name = 2;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.profile.Person",
 | 
			
		||||
//       "firstName": <string>,
 | 
			
		||||
//       "lastName": <string>
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// If the embedded message type is well-known and has a custom JSON
 | 
			
		||||
// representation, that representation will be embedded adding a field
 | 
			
		||||
// `value` which holds the custom JSON in addition to the `@type`
 | 
			
		||||
// field. Example (for message [google.protobuf.Duration][]):
 | 
			
		||||
//
 | 
			
		||||
//     {
 | 
			
		||||
//       "@type": "type.googleapis.com/google.protobuf.Duration",
 | 
			
		||||
//       "value": "1.212s"
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
message Any {
 | 
			
		||||
  // A URL/resource name that uniquely identifies the type of the serialized
 | 
			
		||||
  // protocol buffer message. The last segment of the URL's path must represent
 | 
			
		||||
  // the fully qualified name of the type (as in
 | 
			
		||||
  // `path/google.protobuf.Duration`). The name should be in a canonical form
 | 
			
		||||
  // (e.g., leading "." is not accepted).
 | 
			
		||||
  //
 | 
			
		||||
  // In practice, teams usually precompile into the binary all types that they
 | 
			
		||||
  // expect it to use in the context of Any. However, for URLs which use the
 | 
			
		||||
  // scheme `http`, `https`, or no scheme, one can optionally set up a type
 | 
			
		||||
  // server that maps type URLs to message definitions as follows:
 | 
			
		||||
  //
 | 
			
		||||
  // * If no scheme is provided, `https` is assumed.
 | 
			
		||||
  // * An HTTP GET on the URL must yield a [google.protobuf.Type][]
 | 
			
		||||
  //   value in binary format, or produce an error.
 | 
			
		||||
  // * Applications are allowed to cache lookup results based on the
 | 
			
		||||
  //   URL, or have them precompiled into a binary to avoid any
 | 
			
		||||
  //   lookup. Therefore, binary compatibility needs to be preserved
 | 
			
		||||
  //   on changes to types. (Use versioned type names to manage
 | 
			
		||||
  //   breaking changes.)
 | 
			
		||||
  //
 | 
			
		||||
  // Note: this functionality is not currently available in the official
 | 
			
		||||
  // protobuf release, and it is not used for type URLs beginning with
 | 
			
		||||
  // type.googleapis.com.
 | 
			
		||||
  //
 | 
			
		||||
  // Schemes other than `http`, `https` (or the empty scheme) might be
 | 
			
		||||
  // used with implementation specific semantics.
 | 
			
		||||
  //
 | 
			
		||||
  string type_url = 1;
 | 
			
		||||
 | 
			
		||||
  // Must be a valid serialized protocol buffer of the above specified type.
 | 
			
		||||
  bytes value = 2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/golang/protobuf/ptypes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/golang/protobuf/ptypes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,35 +1,6 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
Package ptypes contains code for interacting with well-known types.
 | 
			
		||||
*/
 | 
			
		||||
// Package ptypes provides functionality for interacting with well-known types.
 | 
			
		||||
package ptypes
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										116
									
								
								vendor/github.com/golang/protobuf/ptypes/duration.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										116
									
								
								vendor/github.com/golang/protobuf/ptypes/duration.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,102 +1,72 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package ptypes
 | 
			
		||||
 | 
			
		||||
// This file implements conversions between google.protobuf.Duration
 | 
			
		||||
// and time.Duration.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	durpb "github.com/golang/protobuf/ptypes/duration"
 | 
			
		||||
	durationpb "github.com/golang/protobuf/ptypes/duration"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Range of google.protobuf.Duration as specified in duration.proto.
 | 
			
		||||
// This is about 10,000 years in seconds.
 | 
			
		||||
const (
 | 
			
		||||
	// Range of a durpb.Duration in seconds, as specified in
 | 
			
		||||
	// google/protobuf/duration.proto. This is about 10,000 years in seconds.
 | 
			
		||||
	maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60)
 | 
			
		||||
	minSeconds = -maxSeconds
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// validateDuration determines whether the durpb.Duration is valid according to the
 | 
			
		||||
// definition in google/protobuf/duration.proto. A valid durpb.Duration
 | 
			
		||||
// may still be too large to fit into a time.Duration (the range of durpb.Duration
 | 
			
		||||
// is about 10,000 years, and the range of time.Duration is about 290).
 | 
			
		||||
func validateDuration(d *durpb.Duration) error {
 | 
			
		||||
	if d == nil {
 | 
			
		||||
		return errors.New("duration: nil Duration")
 | 
			
		||||
	}
 | 
			
		||||
	if d.Seconds < minSeconds || d.Seconds > maxSeconds {
 | 
			
		||||
		return fmt.Errorf("duration: %v: seconds out of range", d)
 | 
			
		||||
	}
 | 
			
		||||
	if d.Nanos <= -1e9 || d.Nanos >= 1e9 {
 | 
			
		||||
		return fmt.Errorf("duration: %v: nanos out of range", d)
 | 
			
		||||
	}
 | 
			
		||||
	// Seconds and Nanos must have the same sign, unless d.Nanos is zero.
 | 
			
		||||
	if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) {
 | 
			
		||||
		return fmt.Errorf("duration: %v: seconds and nanos have different signs", d)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Duration converts a durpb.Duration to a time.Duration. Duration
 | 
			
		||||
// returns an error if the durpb.Duration is invalid or is too large to be
 | 
			
		||||
// represented in a time.Duration.
 | 
			
		||||
func Duration(p *durpb.Duration) (time.Duration, error) {
 | 
			
		||||
	if err := validateDuration(p); err != nil {
 | 
			
		||||
// Duration converts a durationpb.Duration to a time.Duration.
 | 
			
		||||
// Duration returns an error if dur is invalid or overflows a time.Duration.
 | 
			
		||||
func Duration(dur *durationpb.Duration) (time.Duration, error) {
 | 
			
		||||
	if err := validateDuration(dur); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	d := time.Duration(p.Seconds) * time.Second
 | 
			
		||||
	if int64(d/time.Second) != p.Seconds {
 | 
			
		||||
		return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p)
 | 
			
		||||
	d := time.Duration(dur.Seconds) * time.Second
 | 
			
		||||
	if int64(d/time.Second) != dur.Seconds {
 | 
			
		||||
		return 0, fmt.Errorf("duration: %v is out of range for time.Duration", dur)
 | 
			
		||||
	}
 | 
			
		||||
	if p.Nanos != 0 {
 | 
			
		||||
		d += time.Duration(p.Nanos) * time.Nanosecond
 | 
			
		||||
		if (d < 0) != (p.Nanos < 0) {
 | 
			
		||||
			return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p)
 | 
			
		||||
	if dur.Nanos != 0 {
 | 
			
		||||
		d += time.Duration(dur.Nanos) * time.Nanosecond
 | 
			
		||||
		if (d < 0) != (dur.Nanos < 0) {
 | 
			
		||||
			return 0, fmt.Errorf("duration: %v is out of range for time.Duration", dur)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return d, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DurationProto converts a time.Duration to a durpb.Duration.
 | 
			
		||||
func DurationProto(d time.Duration) *durpb.Duration {
 | 
			
		||||
// DurationProto converts a time.Duration to a durationpb.Duration.
 | 
			
		||||
func DurationProto(d time.Duration) *durationpb.Duration {
 | 
			
		||||
	nanos := d.Nanoseconds()
 | 
			
		||||
	secs := nanos / 1e9
 | 
			
		||||
	nanos -= secs * 1e9
 | 
			
		||||
	return &durpb.Duration{
 | 
			
		||||
		Seconds: secs,
 | 
			
		||||
	return &durationpb.Duration{
 | 
			
		||||
		Seconds: int64(secs),
 | 
			
		||||
		Nanos:   int32(nanos),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// validateDuration determines whether the durationpb.Duration is valid
 | 
			
		||||
// according to the definition in google/protobuf/duration.proto.
 | 
			
		||||
// A valid durpb.Duration may still be too large to fit into a time.Duration
 | 
			
		||||
// Note that the range of durationpb.Duration is about 10,000 years,
 | 
			
		||||
// while the range of time.Duration is about 290 years.
 | 
			
		||||
func validateDuration(dur *durationpb.Duration) error {
 | 
			
		||||
	if dur == nil {
 | 
			
		||||
		return errors.New("duration: nil Duration")
 | 
			
		||||
	}
 | 
			
		||||
	if dur.Seconds < minSeconds || dur.Seconds > maxSeconds {
 | 
			
		||||
		return fmt.Errorf("duration: %v: seconds out of range", dur)
 | 
			
		||||
	}
 | 
			
		||||
	if dur.Nanos <= -1e9 || dur.Nanos >= 1e9 {
 | 
			
		||||
		return fmt.Errorf("duration: %v: nanos out of range", dur)
 | 
			
		||||
	}
 | 
			
		||||
	// Seconds and Nanos must have the same sign, unless d.Nanos is zero.
 | 
			
		||||
	if (dur.Seconds < 0 && dur.Nanos > 0) || (dur.Seconds > 0 && dur.Nanos < 0) {
 | 
			
		||||
		return fmt.Errorf("duration: %v: seconds and nanos have different signs", dur)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										194
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										194
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,161 +1,63 @@
 | 
			
		|||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/duration.proto
 | 
			
		||||
// source: github.com/golang/protobuf/ptypes/duration/duration.proto
 | 
			
		||||
 | 
			
		||||
package duration
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	math "math"
 | 
			
		||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
	durationpb "google.golang.org/protobuf/types/known/durationpb"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
// Symbols defined in public import of google/protobuf/duration.proto.
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
type Duration = durationpb.Duration
 | 
			
		||||
 | 
			
		||||
// A Duration represents a signed, fixed-length span of time represented
 | 
			
		||||
// as a count of seconds and fractions of seconds at nanosecond
 | 
			
		||||
// resolution. It is independent of any calendar and concepts like "day"
 | 
			
		||||
// or "month". It is related to Timestamp in that the difference between
 | 
			
		||||
// two Timestamp values is a Duration and it can be added or subtracted
 | 
			
		||||
// from a Timestamp. Range is approximately +-10,000 years.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Duration from two Timestamps in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//
 | 
			
		||||
//     duration.seconds = end.seconds - start.seconds;
 | 
			
		||||
//     duration.nanos = end.nanos - start.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (duration.seconds < 0 && duration.nanos > 0) {
 | 
			
		||||
//       duration.seconds += 1;
 | 
			
		||||
//       duration.nanos -= 1000000000;
 | 
			
		||||
//     } else if (durations.seconds > 0 && duration.nanos < 0) {
 | 
			
		||||
//       duration.seconds -= 1;
 | 
			
		||||
//       duration.nanos += 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//
 | 
			
		||||
//     end.seconds = start.seconds + duration.seconds;
 | 
			
		||||
//     end.nanos = start.nanos + duration.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (end.nanos < 0) {
 | 
			
		||||
//       end.seconds -= 1;
 | 
			
		||||
//       end.nanos += 1000000000;
 | 
			
		||||
//     } else if (end.nanos >= 1000000000) {
 | 
			
		||||
//       end.seconds += 1;
 | 
			
		||||
//       end.nanos -= 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Duration from datetime.timedelta in Python.
 | 
			
		||||
//
 | 
			
		||||
//     td = datetime.timedelta(days=3, minutes=10)
 | 
			
		||||
//     duration = Duration()
 | 
			
		||||
//     duration.FromTimedelta(td)
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Duration type is encoded as a string rather than an
 | 
			
		||||
// object, where the string ends in the suffix "s" (indicating seconds) and
 | 
			
		||||
// is preceded by the number of seconds, with nanoseconds expressed as
 | 
			
		||||
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
 | 
			
		||||
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
 | 
			
		||||
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
 | 
			
		||||
// microsecond should be expressed in JSON format as "3.000001s".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
type Duration struct {
 | 
			
		||||
	// Signed seconds of the span of time. Must be from -315,576,000,000
 | 
			
		||||
	// to +315,576,000,000 inclusive. Note: these bounds are computed from:
 | 
			
		||||
	// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
 | 
			
		||||
	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
 | 
			
		||||
	// Signed fractions of a second at nanosecond resolution of the span
 | 
			
		||||
	// of time. Durations less than one second are represented with a 0
 | 
			
		||||
	// `seconds` field and a positive or negative `nanos` field. For durations
 | 
			
		||||
	// of one second or more, a non-zero value for the `nanos` field must be
 | 
			
		||||
	// of the same sign as the `seconds` field. Must be from -999,999,999
 | 
			
		||||
	// to +999,999,999 inclusive.
 | 
			
		||||
	Nanos                int32    `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
var File_github_com_golang_protobuf_ptypes_duration_duration_proto protoreflect.FileDescriptor
 | 
			
		||||
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc = []byte{
 | 
			
		||||
	0x0a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
 | 
			
		||||
	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
 | 
			
		||||
	0x70, 0x65, 0x73, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x75, 0x72,
 | 
			
		||||
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f,
 | 
			
		||||
	0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72,
 | 
			
		||||
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x35, 0x5a, 0x33, 0x67,
 | 
			
		||||
	0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
 | 
			
		||||
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x73,
 | 
			
		||||
	0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
 | 
			
		||||
	0x6f, 0x6e, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) Reset()         { *m = Duration{} }
 | 
			
		||||
func (m *Duration) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*Duration) ProtoMessage()    {}
 | 
			
		||||
func (*Duration) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_23597b2ebd7ac6c5, []int{0}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes = []interface{}{}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs = []int32{
 | 
			
		||||
	0, // [0:0] is the sub-list for method output_type
 | 
			
		||||
	0, // [0:0] is the sub-list for method input_type
 | 
			
		||||
	0, // [0:0] is the sub-list for extension type_name
 | 
			
		||||
	0, // [0:0] is the sub-list for extension extendee
 | 
			
		||||
	0, // [0:0] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Duration) XXX_WellKnownType() string { return "Duration" }
 | 
			
		||||
 | 
			
		||||
func (m *Duration) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_Duration.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_Duration.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Duration.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_Duration.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *Duration) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Duration.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Duration proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Duration) GetSeconds() int64 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Seconds
 | 
			
		||||
func init() { file_github_com_golang_protobuf_ptypes_duration_duration_proto_init() }
 | 
			
		||||
func file_github_com_golang_protobuf_ptypes_duration_duration_proto_init() {
 | 
			
		||||
	if File_github_com_golang_protobuf_ptypes_duration_duration_proto != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Duration) GetNanos() int32 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Nanos
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Duration)(nil), "google.protobuf.Duration")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_23597b2ebd7ac6c5) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_23597b2ebd7ac6c5 = []byte{
 | 
			
		||||
	// 190 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a,
 | 
			
		||||
	0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56,
 | 
			
		||||
	0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5,
 | 
			
		||||
	0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e,
 | 
			
		||||
	0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c,
 | 
			
		||||
	0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56,
 | 
			
		||||
	0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e,
 | 
			
		||||
	0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4,
 | 
			
		||||
	0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78,
 | 
			
		||||
	0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63,
 | 
			
		||||
	0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00,
 | 
			
		||||
	type x struct{}
 | 
			
		||||
	out := protoimpl.TypeBuilder{
 | 
			
		||||
		File: protoimpl.DescBuilder{
 | 
			
		||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
			
		||||
			RawDescriptor: file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc,
 | 
			
		||||
			NumEnums:      0,
 | 
			
		||||
			NumMessages:   0,
 | 
			
		||||
			NumExtensions: 0,
 | 
			
		||||
			NumServices:   0,
 | 
			
		||||
		},
 | 
			
		||||
		GoTypes:           file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes,
 | 
			
		||||
		DependencyIndexes: file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs,
 | 
			
		||||
	}.Build()
 | 
			
		||||
	File_github_com_golang_protobuf_ptypes_duration_duration_proto = out.File
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_duration_duration_proto_rawDesc = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_duration_duration_proto_goTypes = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_duration_duration_proto_depIdxs = nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										117
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										117
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,117 +0,0 @@
 | 
			
		|||
// Protocol Buffers - Google's data interchange format
 | 
			
		||||
// Copyright 2008 Google Inc.  All rights reserved.
 | 
			
		||||
// https://developers.google.com/protocol-buffers/
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package google.protobuf;
 | 
			
		||||
 | 
			
		||||
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
 | 
			
		||||
option cc_enable_arenas = true;
 | 
			
		||||
option go_package = "github.com/golang/protobuf/ptypes/duration";
 | 
			
		||||
option java_package = "com.google.protobuf";
 | 
			
		||||
option java_outer_classname = "DurationProto";
 | 
			
		||||
option java_multiple_files = true;
 | 
			
		||||
option objc_class_prefix = "GPB";
 | 
			
		||||
 | 
			
		||||
// A Duration represents a signed, fixed-length span of time represented
 | 
			
		||||
// as a count of seconds and fractions of seconds at nanosecond
 | 
			
		||||
// resolution. It is independent of any calendar and concepts like "day"
 | 
			
		||||
// or "month". It is related to Timestamp in that the difference between
 | 
			
		||||
// two Timestamp values is a Duration and it can be added or subtracted
 | 
			
		||||
// from a Timestamp. Range is approximately +-10,000 years.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Duration from two Timestamps in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//
 | 
			
		||||
//     duration.seconds = end.seconds - start.seconds;
 | 
			
		||||
//     duration.nanos = end.nanos - start.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (duration.seconds < 0 && duration.nanos > 0) {
 | 
			
		||||
//       duration.seconds += 1;
 | 
			
		||||
//       duration.nanos -= 1000000000;
 | 
			
		||||
//     } else if (durations.seconds > 0 && duration.nanos < 0) {
 | 
			
		||||
//       duration.seconds -= 1;
 | 
			
		||||
//       duration.nanos += 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp start = ...;
 | 
			
		||||
//     Duration duration = ...;
 | 
			
		||||
//     Timestamp end = ...;
 | 
			
		||||
//
 | 
			
		||||
//     end.seconds = start.seconds + duration.seconds;
 | 
			
		||||
//     end.nanos = start.nanos + duration.nanos;
 | 
			
		||||
//
 | 
			
		||||
//     if (end.nanos < 0) {
 | 
			
		||||
//       end.seconds -= 1;
 | 
			
		||||
//       end.nanos += 1000000000;
 | 
			
		||||
//     } else if (end.nanos >= 1000000000) {
 | 
			
		||||
//       end.seconds += 1;
 | 
			
		||||
//       end.nanos -= 1000000000;
 | 
			
		||||
//     }
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Duration from datetime.timedelta in Python.
 | 
			
		||||
//
 | 
			
		||||
//     td = datetime.timedelta(days=3, minutes=10)
 | 
			
		||||
//     duration = Duration()
 | 
			
		||||
//     duration.FromTimedelta(td)
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Duration type is encoded as a string rather than an
 | 
			
		||||
// object, where the string ends in the suffix "s" (indicating seconds) and
 | 
			
		||||
// is preceded by the number of seconds, with nanoseconds expressed as
 | 
			
		||||
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
 | 
			
		||||
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
 | 
			
		||||
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
 | 
			
		||||
// microsecond should be expressed in JSON format as "3.000001s".
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
message Duration {
 | 
			
		||||
 | 
			
		||||
  // Signed seconds of the span of time. Must be from -315,576,000,000
 | 
			
		||||
  // to +315,576,000,000 inclusive. Note: these bounds are computed from:
 | 
			
		||||
  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
 | 
			
		||||
  int64 seconds = 1;
 | 
			
		||||
 | 
			
		||||
  // Signed fractions of a second at nanosecond resolution of the span
 | 
			
		||||
  // of time. Durations less than one second are represented with a 0
 | 
			
		||||
  // `seconds` field and a positive or negative `nanos` field. For durations
 | 
			
		||||
  // of one second or more, a non-zero value for the `nanos` field must be
 | 
			
		||||
  // of the same sign as the `seconds` field. Must be from -999,999,999
 | 
			
		||||
  // to +999,999,999 inclusive.
 | 
			
		||||
  int32 nanos = 2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										161
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										161
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,46 +1,18 @@
 | 
			
		|||
// Go support for Protocol Buffers - Google's data interchange format
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2016 The Go Authors.  All rights reserved.
 | 
			
		||||
// https://github.com/golang/protobuf
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package ptypes
 | 
			
		||||
 | 
			
		||||
// This file implements operations on google.protobuf.Timestamp.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	tspb "github.com/golang/protobuf/ptypes/timestamp"
 | 
			
		||||
	timestamppb "github.com/golang/protobuf/ptypes/timestamp"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Range of google.protobuf.Duration as specified in timestamp.proto.
 | 
			
		||||
const (
 | 
			
		||||
	// Seconds field of the earliest valid Timestamp.
 | 
			
		||||
	// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix().
 | 
			
		||||
| 
						 | 
				
			
			@ -50,17 +22,71 @@ const (
 | 
			
		|||
	maxValidSeconds = 253402300800
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Timestamp converts a timestamppb.Timestamp to a time.Time.
 | 
			
		||||
// It returns an error if the argument is invalid.
 | 
			
		||||
//
 | 
			
		||||
// Unlike most Go functions, if Timestamp returns an error, the first return
 | 
			
		||||
// value is not the zero time.Time. Instead, it is the value obtained from the
 | 
			
		||||
// time.Unix function when passed the contents of the Timestamp, in the UTC
 | 
			
		||||
// locale. This may or may not be a meaningful time; many invalid Timestamps
 | 
			
		||||
// do map to valid time.Times.
 | 
			
		||||
//
 | 
			
		||||
// A nil Timestamp returns an error. The first return value in that case is
 | 
			
		||||
// undefined.
 | 
			
		||||
func Timestamp(ts *timestamppb.Timestamp) (time.Time, error) {
 | 
			
		||||
	// Don't return the zero value on error, because corresponds to a valid
 | 
			
		||||
	// timestamp. Instead return whatever time.Unix gives us.
 | 
			
		||||
	var t time.Time
 | 
			
		||||
	if ts == nil {
 | 
			
		||||
		t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp
 | 
			
		||||
	} else {
 | 
			
		||||
		t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC()
 | 
			
		||||
	}
 | 
			
		||||
	return t, validateTimestamp(ts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampNow returns a google.protobuf.Timestamp for the current time.
 | 
			
		||||
func TimestampNow() *timestamppb.Timestamp {
 | 
			
		||||
	ts, err := TimestampProto(time.Now())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic("ptypes: time.Now() out of Timestamp range")
 | 
			
		||||
	}
 | 
			
		||||
	return ts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto.
 | 
			
		||||
// It returns an error if the resulting Timestamp is invalid.
 | 
			
		||||
func TimestampProto(t time.Time) (*timestamppb.Timestamp, error) {
 | 
			
		||||
	ts := ×tamppb.Timestamp{
 | 
			
		||||
		Seconds: t.Unix(),
 | 
			
		||||
		Nanos:   int32(t.Nanosecond()),
 | 
			
		||||
	}
 | 
			
		||||
	if err := validateTimestamp(ts); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampString returns the RFC 3339 string for valid Timestamps.
 | 
			
		||||
// For invalid Timestamps, it returns an error message in parentheses.
 | 
			
		||||
func TimestampString(ts *timestamppb.Timestamp) string {
 | 
			
		||||
	t, err := Timestamp(ts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Sprintf("(%v)", err)
 | 
			
		||||
	}
 | 
			
		||||
	return t.Format(time.RFC3339Nano)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// validateTimestamp determines whether a Timestamp is valid.
 | 
			
		||||
// A valid timestamp represents a time in the range
 | 
			
		||||
// [0001-01-01, 10000-01-01) and has a Nanos field
 | 
			
		||||
// in the range [0, 1e9).
 | 
			
		||||
// A valid timestamp represents a time in the range [0001-01-01, 10000-01-01)
 | 
			
		||||
// and has a Nanos field in the range [0, 1e9).
 | 
			
		||||
//
 | 
			
		||||
// If the Timestamp is valid, validateTimestamp returns nil.
 | 
			
		||||
// Otherwise, it returns an error that describes
 | 
			
		||||
// the problem.
 | 
			
		||||
// Otherwise, it returns an error that describes the problem.
 | 
			
		||||
//
 | 
			
		||||
// Every valid Timestamp can be represented by a time.Time, but the converse is not true.
 | 
			
		||||
func validateTimestamp(ts *tspb.Timestamp) error {
 | 
			
		||||
// Every valid Timestamp can be represented by a time.Time,
 | 
			
		||||
// but the converse is not true.
 | 
			
		||||
func validateTimestamp(ts *timestamppb.Timestamp) error {
 | 
			
		||||
	if ts == nil {
 | 
			
		||||
		return errors.New("timestamp: nil Timestamp")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -75,58 +101,3 @@ func validateTimestamp(ts *tspb.Timestamp) error {
 | 
			
		|||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Timestamp converts a google.protobuf.Timestamp proto to a time.Time.
 | 
			
		||||
// It returns an error if the argument is invalid.
 | 
			
		||||
//
 | 
			
		||||
// Unlike most Go functions, if Timestamp returns an error, the first return value
 | 
			
		||||
// is not the zero time.Time. Instead, it is the value obtained from the
 | 
			
		||||
// time.Unix function when passed the contents of the Timestamp, in the UTC
 | 
			
		||||
// locale. This may or may not be a meaningful time; many invalid Timestamps
 | 
			
		||||
// do map to valid time.Times.
 | 
			
		||||
//
 | 
			
		||||
// A nil Timestamp returns an error. The first return value in that case is
 | 
			
		||||
// undefined.
 | 
			
		||||
func Timestamp(ts *tspb.Timestamp) (time.Time, error) {
 | 
			
		||||
	// Don't return the zero value on error, because corresponds to a valid
 | 
			
		||||
	// timestamp. Instead return whatever time.Unix gives us.
 | 
			
		||||
	var t time.Time
 | 
			
		||||
	if ts == nil {
 | 
			
		||||
		t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp
 | 
			
		||||
	} else {
 | 
			
		||||
		t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC()
 | 
			
		||||
	}
 | 
			
		||||
	return t, validateTimestamp(ts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampNow returns a google.protobuf.Timestamp for the current time.
 | 
			
		||||
func TimestampNow() *tspb.Timestamp {
 | 
			
		||||
	ts, err := TimestampProto(time.Now())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic("ptypes: time.Now() out of Timestamp range")
 | 
			
		||||
	}
 | 
			
		||||
	return ts
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto.
 | 
			
		||||
// It returns an error if the resulting Timestamp is invalid.
 | 
			
		||||
func TimestampProto(t time.Time) (*tspb.Timestamp, error) {
 | 
			
		||||
	ts := &tspb.Timestamp{
 | 
			
		||||
		Seconds: t.Unix(),
 | 
			
		||||
		Nanos:   int32(t.Nanosecond()),
 | 
			
		||||
	}
 | 
			
		||||
	if err := validateTimestamp(ts); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return ts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid
 | 
			
		||||
// Timestamps, it returns an error message in parentheses.
 | 
			
		||||
func TimestampString(ts *tspb.Timestamp) string {
 | 
			
		||||
	t, err := Timestamp(ts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return fmt.Sprintf("(%v)", err)
 | 
			
		||||
	}
 | 
			
		||||
	return t.Format(time.RFC3339Nano)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										213
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										213
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,179 +1,64 @@
 | 
			
		|||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
			
		||||
// source: google/protobuf/timestamp.proto
 | 
			
		||||
// source: github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
 | 
			
		||||
 | 
			
		||||
package timestamp
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	fmt "fmt"
 | 
			
		||||
	proto "github.com/golang/protobuf/proto"
 | 
			
		||||
	math "math"
 | 
			
		||||
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 | 
			
		||||
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 | 
			
		||||
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 | 
			
		||||
	reflect "reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Reference imports to suppress errors if they are not otherwise used.
 | 
			
		||||
var _ = proto.Marshal
 | 
			
		||||
var _ = fmt.Errorf
 | 
			
		||||
var _ = math.Inf
 | 
			
		||||
// Symbols defined in public import of google/protobuf/timestamp.proto.
 | 
			
		||||
 | 
			
		||||
// This is a compile-time assertion to ensure that this generated file
 | 
			
		||||
// is compatible with the proto package it is being compiled against.
 | 
			
		||||
// A compilation error at this line likely means your copy of the
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
type Timestamp = timestamppb.Timestamp
 | 
			
		||||
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone
 | 
			
		||||
// or calendar, represented as seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution in UTC Epoch time. It is encoded using the
 | 
			
		||||
// Proleptic Gregorian Calendar which extends the Gregorian calendar
 | 
			
		||||
// backwards to year one. It is encoded assuming all minutes are 60
 | 
			
		||||
// seconds long, i.e. leap seconds are "smeared" so that no leap second
 | 
			
		||||
// table is needed for interpretation. Range is from
 | 
			
		||||
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
 | 
			
		||||
// By restricting to that range, we ensure that we can convert to
 | 
			
		||||
// and from  RFC 3339 date strings.
 | 
			
		||||
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Timestamp from POSIX `time()`.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(time(NULL));
 | 
			
		||||
//     timestamp.set_nanos(0);
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
 | 
			
		||||
//
 | 
			
		||||
//     struct timeval tv;
 | 
			
		||||
//     gettimeofday(&tv, NULL);
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(tv.tv_sec);
 | 
			
		||||
//     timestamp.set_nanos(tv.tv_usec * 1000);
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
 | 
			
		||||
//
 | 
			
		||||
//     FILETIME ft;
 | 
			
		||||
//     GetSystemTimeAsFileTime(&ft);
 | 
			
		||||
//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
 | 
			
		||||
//
 | 
			
		||||
//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
 | 
			
		||||
//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
 | 
			
		||||
//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
 | 
			
		||||
//
 | 
			
		||||
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
 | 
			
		||||
//
 | 
			
		||||
//     long millis = System.currentTimeMillis();
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
 | 
			
		||||
//         .setNanos((int) ((millis % 1000) * 1000000)).build();
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// Example 5: Compute Timestamp from current time in Python.
 | 
			
		||||
//
 | 
			
		||||
//     timestamp = Timestamp()
 | 
			
		||||
//     timestamp.GetCurrentTime()
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Timestamp type is encoded as a string in the
 | 
			
		||||
// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
 | 
			
		||||
// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
 | 
			
		||||
// where {year} is always expressed using four digits while {month}, {day},
 | 
			
		||||
// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
 | 
			
		||||
// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
 | 
			
		||||
// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
 | 
			
		||||
// is required. A proto3 JSON serializer should always use UTC (as indicated by
 | 
			
		||||
// "Z") when printing the Timestamp type and a proto3 JSON parser should be
 | 
			
		||||
// able to accept both UTC and other timezones (as indicated by an offset).
 | 
			
		||||
//
 | 
			
		||||
// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
 | 
			
		||||
// 01:30 UTC on January 15, 2017.
 | 
			
		||||
//
 | 
			
		||||
// In JavaScript, one can convert a Date object to this format using the
 | 
			
		||||
// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
 | 
			
		||||
// method. In Python, a standard `datetime.datetime` object can be converted
 | 
			
		||||
// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
 | 
			
		||||
// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
 | 
			
		||||
// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--
 | 
			
		||||
// ) to obtain a formatter capable of generating timestamps in this format.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
type Timestamp struct {
 | 
			
		||||
	// Represents seconds of UTC time since Unix epoch
 | 
			
		||||
	// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
 | 
			
		||||
	// 9999-12-31T23:59:59Z inclusive.
 | 
			
		||||
	Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
 | 
			
		||||
	// Non-negative fractions of a second at nanosecond resolution. Negative
 | 
			
		||||
	// second values with fractions must still have non-negative nanos values
 | 
			
		||||
	// that count forward in time. Must be from 0 to 999,999,999
 | 
			
		||||
	// inclusive.
 | 
			
		||||
	Nanos                int32    `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte   `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32    `json:"-"`
 | 
			
		||||
var File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto protoreflect.FileDescriptor
 | 
			
		||||
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc = []byte{
 | 
			
		||||
	0x0a, 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
 | 
			
		||||
	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
 | 
			
		||||
	0x70, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, 0x74, 0x69,
 | 
			
		||||
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67,
 | 
			
		||||
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74,
 | 
			
		||||
	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x37,
 | 
			
		||||
	0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c,
 | 
			
		||||
	0x61, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x70, 0x74, 0x79,
 | 
			
		||||
	0x70, 0x65, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3b, 0x74, 0x69,
 | 
			
		||||
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
 | 
			
		||||
	0x33,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) Reset()         { *m = Timestamp{} }
 | 
			
		||||
func (m *Timestamp) String() string { return proto.CompactTextString(m) }
 | 
			
		||||
func (*Timestamp) ProtoMessage()    {}
 | 
			
		||||
func (*Timestamp) Descriptor() ([]byte, []int) {
 | 
			
		||||
	return fileDescriptor_292007bbfe81227e, []int{0}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes = []interface{}{}
 | 
			
		||||
var file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs = []int32{
 | 
			
		||||
	0, // [0:0] is the sub-list for method output_type
 | 
			
		||||
	0, // [0:0] is the sub-list for method input_type
 | 
			
		||||
	0, // [0:0] is the sub-list for extension type_name
 | 
			
		||||
	0, // [0:0] is the sub-list for extension extendee
 | 
			
		||||
	0, // [0:0] is the sub-list for field type_name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" }
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) XXX_Unmarshal(b []byte) error {
 | 
			
		||||
	return xxx_messageInfo_Timestamp.Unmarshal(m, b)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 | 
			
		||||
	return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Merge(src proto.Message) {
 | 
			
		||||
	xxx_messageInfo_Timestamp.Merge(m, src)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_Size() int {
 | 
			
		||||
	return xxx_messageInfo_Timestamp.Size(m)
 | 
			
		||||
}
 | 
			
		||||
func (m *Timestamp) XXX_DiscardUnknown() {
 | 
			
		||||
	xxx_messageInfo_Timestamp.DiscardUnknown(m)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xxx_messageInfo_Timestamp proto.InternalMessageInfo
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) GetSeconds() int64 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Seconds
 | 
			
		||||
func init() { file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init() }
 | 
			
		||||
func file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init() {
 | 
			
		||||
	if File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *Timestamp) GetNanos() int32 {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.Nanos
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_292007bbfe81227e = []byte{
 | 
			
		||||
	// 191 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f,
 | 
			
		||||
	0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d,
 | 
			
		||||
	0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28,
 | 
			
		||||
	0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5,
 | 
			
		||||
	0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89,
 | 
			
		||||
	0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70,
 | 
			
		||||
	0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51,
 | 
			
		||||
	0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89,
 | 
			
		||||
	0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71,
 | 
			
		||||
	0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a,
 | 
			
		||||
	0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43,
 | 
			
		||||
	0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00,
 | 
			
		||||
	type x struct{}
 | 
			
		||||
	out := protoimpl.TypeBuilder{
 | 
			
		||||
		File: protoimpl.DescBuilder{
 | 
			
		||||
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 | 
			
		||||
			RawDescriptor: file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc,
 | 
			
		||||
			NumEnums:      0,
 | 
			
		||||
			NumMessages:   0,
 | 
			
		||||
			NumExtensions: 0,
 | 
			
		||||
			NumServices:   0,
 | 
			
		||||
		},
 | 
			
		||||
		GoTypes:           file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes,
 | 
			
		||||
		DependencyIndexes: file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs,
 | 
			
		||||
	}.Build()
 | 
			
		||||
	File_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto = out.File
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_rawDesc = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_goTypes = nil
 | 
			
		||||
	file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_depIdxs = nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										135
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										135
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,135 +0,0 @@
 | 
			
		|||
// Protocol Buffers - Google's data interchange format
 | 
			
		||||
// Copyright 2008 Google Inc.  All rights reserved.
 | 
			
		||||
// https://developers.google.com/protocol-buffers/
 | 
			
		||||
//
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
// notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
// copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
// in the documentation and/or other materials provided with the
 | 
			
		||||
// distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
// contributors may be used to endorse or promote products derived from
 | 
			
		||||
// this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
syntax = "proto3";
 | 
			
		||||
 | 
			
		||||
package google.protobuf;
 | 
			
		||||
 | 
			
		||||
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
 | 
			
		||||
option cc_enable_arenas = true;
 | 
			
		||||
option go_package = "github.com/golang/protobuf/ptypes/timestamp";
 | 
			
		||||
option java_package = "com.google.protobuf";
 | 
			
		||||
option java_outer_classname = "TimestampProto";
 | 
			
		||||
option java_multiple_files = true;
 | 
			
		||||
option objc_class_prefix = "GPB";
 | 
			
		||||
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone
 | 
			
		||||
// or calendar, represented as seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution in UTC Epoch time. It is encoded using the
 | 
			
		||||
// Proleptic Gregorian Calendar which extends the Gregorian calendar
 | 
			
		||||
// backwards to year one. It is encoded assuming all minutes are 60
 | 
			
		||||
// seconds long, i.e. leap seconds are "smeared" so that no leap second
 | 
			
		||||
// table is needed for interpretation. Range is from
 | 
			
		||||
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
 | 
			
		||||
// By restricting to that range, we ensure that we can convert to
 | 
			
		||||
// and from  RFC 3339 date strings.
 | 
			
		||||
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
// Example 1: Compute Timestamp from POSIX `time()`.
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(time(NULL));
 | 
			
		||||
//     timestamp.set_nanos(0);
 | 
			
		||||
//
 | 
			
		||||
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
 | 
			
		||||
//
 | 
			
		||||
//     struct timeval tv;
 | 
			
		||||
//     gettimeofday(&tv, NULL);
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds(tv.tv_sec);
 | 
			
		||||
//     timestamp.set_nanos(tv.tv_usec * 1000);
 | 
			
		||||
//
 | 
			
		||||
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
 | 
			
		||||
//
 | 
			
		||||
//     FILETIME ft;
 | 
			
		||||
//     GetSystemTimeAsFileTime(&ft);
 | 
			
		||||
//     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
 | 
			
		||||
//
 | 
			
		||||
//     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
 | 
			
		||||
//     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
 | 
			
		||||
//     Timestamp timestamp;
 | 
			
		||||
//     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
 | 
			
		||||
//     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
 | 
			
		||||
//
 | 
			
		||||
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
 | 
			
		||||
//
 | 
			
		||||
//     long millis = System.currentTimeMillis();
 | 
			
		||||
//
 | 
			
		||||
//     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
 | 
			
		||||
//         .setNanos((int) ((millis % 1000) * 1000000)).build();
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
// Example 5: Compute Timestamp from current time in Python.
 | 
			
		||||
//
 | 
			
		||||
//     timestamp = Timestamp()
 | 
			
		||||
//     timestamp.GetCurrentTime()
 | 
			
		||||
//
 | 
			
		||||
// # JSON Mapping
 | 
			
		||||
//
 | 
			
		||||
// In JSON format, the Timestamp type is encoded as a string in the
 | 
			
		||||
// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
 | 
			
		||||
// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
 | 
			
		||||
// where {year} is always expressed using four digits while {month}, {day},
 | 
			
		||||
// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
 | 
			
		||||
// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
 | 
			
		||||
// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
 | 
			
		||||
// is required. A proto3 JSON serializer should always use UTC (as indicated by
 | 
			
		||||
// "Z") when printing the Timestamp type and a proto3 JSON parser should be
 | 
			
		||||
// able to accept both UTC and other timezones (as indicated by an offset).
 | 
			
		||||
//
 | 
			
		||||
// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
 | 
			
		||||
// 01:30 UTC on January 15, 2017.
 | 
			
		||||
//
 | 
			
		||||
// In JavaScript, one can convert a Date object to this format using the
 | 
			
		||||
// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
 | 
			
		||||
// method. In Python, a standard `datetime.datetime` object can be converted
 | 
			
		||||
// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
 | 
			
		||||
// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
 | 
			
		||||
// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--
 | 
			
		||||
// ) to obtain a formatter capable of generating timestamps in this format.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
message Timestamp {
 | 
			
		||||
 | 
			
		||||
  // Represents seconds of UTC time since Unix epoch
 | 
			
		||||
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
 | 
			
		||||
  // 9999-12-31T23:59:59Z inclusive.
 | 
			
		||||
  int64 seconds = 1;
 | 
			
		||||
 | 
			
		||||
  // Non-negative fractions of a second at nanosecond resolution. Negative
 | 
			
		||||
  // second values with fractions must still have non-negative nanos values
 | 
			
		||||
  // that count forward in time. Must be from 0 to 999,999,999
 | 
			
		||||
  // inclusive.
 | 
			
		||||
  int32 nanos = 2;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/BurntSushi/toml/COPYING → vendor/github.com/jpillora/backoff/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/BurntSushi/toml/COPYING → vendor/github.com/jpillora/backoff/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2013 TOML authors
 | 
			
		||||
Copyright (c) 2017 Jaime Pillora
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
| 
						 | 
				
			
			@ -9,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		|||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in
 | 
			
		||||
all copies or substantial portions of the Software.
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
THE SOFTWARE.
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
							
								
								
									
										119
									
								
								vendor/github.com/jpillora/backoff/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								vendor/github.com/jpillora/backoff/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,119 @@
 | 
			
		|||
# Backoff
 | 
			
		||||
 | 
			
		||||
A simple exponential backoff counter in Go (Golang)
 | 
			
		||||
 | 
			
		||||
[](https://godoc.org/github.com/jpillora/backoff) [](https://circleci.com/gh/jpillora/backoff)
 | 
			
		||||
 | 
			
		||||
### Install
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ go get -v github.com/jpillora/backoff
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Usage
 | 
			
		||||
 | 
			
		||||
Backoff is a `time.Duration` counter. It starts at `Min`. After every call to `Duration()` it is  multiplied by `Factor`. It is capped at `Max`. It returns to `Min` on every call to `Reset()`. `Jitter` adds randomness ([see below](#example-using-jitter)). Used in conjunction with the `time` package.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
#### Simple example
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
 | 
			
		||||
b := &backoff.Backoff{
 | 
			
		||||
	//These are the defaults
 | 
			
		||||
	Min:    100 * time.Millisecond,
 | 
			
		||||
	Max:    10 * time.Second,
 | 
			
		||||
	Factor: 2,
 | 
			
		||||
	Jitter: false,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
 | 
			
		||||
fmt.Printf("Reset!\n")
 | 
			
		||||
b.Reset()
 | 
			
		||||
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
100ms
 | 
			
		||||
200ms
 | 
			
		||||
400ms
 | 
			
		||||
Reset!
 | 
			
		||||
100ms
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
#### Example using `net` package
 | 
			
		||||
 | 
			
		||||
``` go
 | 
			
		||||
b := &backoff.Backoff{
 | 
			
		||||
    Max:    5 * time.Minute,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for {
 | 
			
		||||
	conn, err := net.Dial("tcp", "example.com:5309")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		d := b.Duration()
 | 
			
		||||
		fmt.Printf("%s, reconnecting in %s", err, d)
 | 
			
		||||
		time.Sleep(d)
 | 
			
		||||
		continue
 | 
			
		||||
	}
 | 
			
		||||
	//connected
 | 
			
		||||
	b.Reset()
 | 
			
		||||
	conn.Write([]byte("hello world!"))
 | 
			
		||||
	// ... Read ... Write ... etc
 | 
			
		||||
	conn.Close()
 | 
			
		||||
	//disconnected
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
#### Example using `Jitter`
 | 
			
		||||
 | 
			
		||||
Enabling `Jitter` adds some randomization to the backoff durations. [See Amazon's writeup of performance gains using jitter](http://www.awsarchitectureblog.com/2015/03/backoff.html). Seeding is not necessary but doing so gives repeatable results.
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
import "math/rand"
 | 
			
		||||
 | 
			
		||||
b := &backoff.Backoff{
 | 
			
		||||
	Jitter: true,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rand.Seed(42)
 | 
			
		||||
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
 | 
			
		||||
fmt.Printf("Reset!\n")
 | 
			
		||||
b.Reset()
 | 
			
		||||
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
fmt.Printf("%s\n", b.Duration())
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
100ms
 | 
			
		||||
106.600049ms
 | 
			
		||||
281.228155ms
 | 
			
		||||
Reset!
 | 
			
		||||
100ms
 | 
			
		||||
104.381845ms
 | 
			
		||||
214.957989ms
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Documentation
 | 
			
		||||
 | 
			
		||||
https://godoc.org/github.com/jpillora/backoff
 | 
			
		||||
 | 
			
		||||
#### Credits
 | 
			
		||||
 | 
			
		||||
Forked from [some JavaScript](https://github.com/segmentio/backo) written by [@tj](https://github.com/tj)
 | 
			
		||||
							
								
								
									
										100
									
								
								vendor/github.com/jpillora/backoff/backoff.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/jpillora/backoff/backoff.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
// Package backoff provides an exponential-backoff implementation.
 | 
			
		||||
package backoff
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"math"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Backoff is a time.Duration counter, starting at Min. After every call to
 | 
			
		||||
// the Duration method the current timing is multiplied by Factor, but it
 | 
			
		||||
// never exceeds Max.
 | 
			
		||||
//
 | 
			
		||||
// Backoff is not generally concurrent-safe, but the ForAttempt method can
 | 
			
		||||
// be used concurrently.
 | 
			
		||||
type Backoff struct {
 | 
			
		||||
	attempt uint64
 | 
			
		||||
	// Factor is the multiplying factor for each increment step
 | 
			
		||||
	Factor float64
 | 
			
		||||
	// Jitter eases contention by randomizing backoff steps
 | 
			
		||||
	Jitter bool
 | 
			
		||||
	// Min and Max are the minimum and maximum values of the counter
 | 
			
		||||
	Min, Max time.Duration
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Duration returns the duration for the current attempt before incrementing
 | 
			
		||||
// the attempt counter. See ForAttempt.
 | 
			
		||||
func (b *Backoff) Duration() time.Duration {
 | 
			
		||||
	d := b.ForAttempt(float64(atomic.AddUint64(&b.attempt, 1) - 1))
 | 
			
		||||
	return d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const maxInt64 = float64(math.MaxInt64 - 512)
 | 
			
		||||
 | 
			
		||||
// ForAttempt returns the duration for a specific attempt. This is useful if
 | 
			
		||||
// you have a large number of independent Backoffs, but don't want use
 | 
			
		||||
// unnecessary memory storing the Backoff parameters per Backoff. The first
 | 
			
		||||
// attempt should be 0.
 | 
			
		||||
//
 | 
			
		||||
// ForAttempt is concurrent-safe.
 | 
			
		||||
func (b *Backoff) ForAttempt(attempt float64) time.Duration {
 | 
			
		||||
	// Zero-values are nonsensical, so we use
 | 
			
		||||
	// them to apply defaults
 | 
			
		||||
	min := b.Min
 | 
			
		||||
	if min <= 0 {
 | 
			
		||||
		min = 100 * time.Millisecond
 | 
			
		||||
	}
 | 
			
		||||
	max := b.Max
 | 
			
		||||
	if max <= 0 {
 | 
			
		||||
		max = 10 * time.Second
 | 
			
		||||
	}
 | 
			
		||||
	if min >= max {
 | 
			
		||||
		// short-circuit
 | 
			
		||||
		return max
 | 
			
		||||
	}
 | 
			
		||||
	factor := b.Factor
 | 
			
		||||
	if factor <= 0 {
 | 
			
		||||
		factor = 2
 | 
			
		||||
	}
 | 
			
		||||
	//calculate this duration
 | 
			
		||||
	minf := float64(min)
 | 
			
		||||
	durf := minf * math.Pow(factor, attempt)
 | 
			
		||||
	if b.Jitter {
 | 
			
		||||
		durf = rand.Float64()*(durf-minf) + minf
 | 
			
		||||
	}
 | 
			
		||||
	//ensure float64 wont overflow int64
 | 
			
		||||
	if durf > maxInt64 {
 | 
			
		||||
		return max
 | 
			
		||||
	}
 | 
			
		||||
	dur := time.Duration(durf)
 | 
			
		||||
	//keep within bounds
 | 
			
		||||
	if dur < min {
 | 
			
		||||
		return min
 | 
			
		||||
	}
 | 
			
		||||
	if dur > max {
 | 
			
		||||
		return max
 | 
			
		||||
	}
 | 
			
		||||
	return dur
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reset restarts the current attempt counter at zero.
 | 
			
		||||
func (b *Backoff) Reset() {
 | 
			
		||||
	atomic.StoreUint64(&b.attempt, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Attempt returns the current attempt counter value.
 | 
			
		||||
func (b *Backoff) Attempt() float64 {
 | 
			
		||||
	return float64(atomic.LoadUint64(&b.attempt))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Copy returns a backoff with equals constraints as the original
 | 
			
		||||
func (b *Backoff) Copy() *Backoff {
 | 
			
		||||
	return &Backoff{
 | 
			
		||||
		Factor: b.Factor,
 | 
			
		||||
		Jitter: b.Jitter,
 | 
			
		||||
		Min:    b.Min,
 | 
			
		||||
		Max:    b.Max,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/jpillora/backoff/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/jpillora/backoff/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
module github.com/jpillora/backoff
 | 
			
		||||
 | 
			
		||||
go 1.13
 | 
			
		||||
							
								
								
									
										16
									
								
								vendor/github.com/mwitkow/go-conntrack/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/mwitkow/go-conntrack/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,13 +1,17 @@
 | 
			
		|||
sudo: false
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - 1.7
 | 
			
		||||
- "1.8"
 | 
			
		||||
- "1.9"
 | 
			
		||||
- "1.10"
 | 
			
		||||
- "1.11"
 | 
			
		||||
- "1.12"
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - go get github.com/stretchr/testify
 | 
			
		||||
  - go get github.com/prometheus/client_golang/prometheus
 | 
			
		||||
  - go get golang.org/x/net/context
 | 
			
		||||
  - go get golang.org/x/net/trace
 | 
			
		||||
- go get github.com/stretchr/testify
 | 
			
		||||
- go get github.com/prometheus/client_golang/prometheus
 | 
			
		||||
- go get golang.org/x/net/context
 | 
			
		||||
- go get golang.org/x/net/trace
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
 - go test -v ./...
 | 
			
		||||
- go test -v ./...
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										31
									
								
								vendor/github.com/mwitkow/go-conntrack/listener_wrapper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/mwitkow/go-conntrack/listener_wrapper.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -6,11 +6,11 @@ package conntrack
 | 
			
		|||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/trace"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/jpillora/backoff"
 | 
			
		||||
	"golang.org/x/net/trace"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,7 @@ type listenerOpts struct {
 | 
			
		|||
	monitoring   bool
 | 
			
		||||
	tracing      bool
 | 
			
		||||
	tcpKeepAlive time.Duration
 | 
			
		||||
	retryBackoff *backoff.Backoff
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type listenerOpt func(*listenerOpts)
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +48,14 @@ func TrackWithTracing() listenerOpt {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TrackWithRetries enables retrying of temporary Accept() errors, with the given backoff between attempts.
 | 
			
		||||
// Concurrent accept calls that receive temporary errors have independent backoff scaling.
 | 
			
		||||
func TrackWithRetries(b backoff.Backoff) listenerOpt {
 | 
			
		||||
	return func(opts *listenerOpts) {
 | 
			
		||||
		opts.retryBackoff = &b
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TrackWithTcpKeepAlive makes sure that any `net.TCPConn` that get accepted have a keep-alive.
 | 
			
		||||
// This is useful for HTTP servers in order for, for example laptops, to not use up resources on the
 | 
			
		||||
// server while they don't utilise their connection.
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +92,20 @@ func NewListener(inner net.Listener, optFuncs ...listenerOpt) net.Listener {
 | 
			
		|||
 | 
			
		||||
func (ct *connTrackListener) Accept() (net.Conn, error) {
 | 
			
		||||
	// TODO(mwitkow): Add monitoring of failed accept.
 | 
			
		||||
	conn, err := ct.Listener.Accept()
 | 
			
		||||
	var (
 | 
			
		||||
		conn net.Conn
 | 
			
		||||
		err  error
 | 
			
		||||
	)
 | 
			
		||||
	for attempt := 0; ; attempt++ {
 | 
			
		||||
		conn, err = ct.Listener.Accept()
 | 
			
		||||
		if err == nil || ct.opts.retryBackoff == nil {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if t, ok := err.(interface{ Temporary() bool }); !ok || !t.Temporary() {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(ct.opts.retryBackoff.ForAttempt(float64(attempt)))
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +124,6 @@ type serverConnTracker struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func newServerConnTracker(inner net.Conn, opts *listenerOpts) net.Conn {
 | 
			
		||||
 | 
			
		||||
	tracker := &serverConnTracker{
 | 
			
		||||
		Conn: inner,
 | 
			
		||||
		opts: opts,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								vendor/github.com/prometheus/client_golang/prometheus/counter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/prometheus/client_golang/prometheus/counter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -309,6 +309,8 @@ type CounterFunc interface {
 | 
			
		|||
// provided function must be concurrency-safe. The function should also honor
 | 
			
		||||
// the contract for a Counter (values only go up, not down), but compliance will
 | 
			
		||||
// not be checked.
 | 
			
		||||
//
 | 
			
		||||
// Check out the ExampleGaugeFunc examples for the similar GaugeFunc.
 | 
			
		||||
func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc {
 | 
			
		||||
	return newValueFunc(NewDesc(
 | 
			
		||||
		BuildFQName(opts.Namespace, opts.Subsystem, opts.Name),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								vendor/github.com/prometheus/client_golang/prometheus/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/prometheus/client_golang/prometheus/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -84,25 +84,21 @@
 | 
			
		|||
// of those four metric types can be found in the Prometheus docs:
 | 
			
		||||
// https://prometheus.io/docs/concepts/metric_types/
 | 
			
		||||
//
 | 
			
		||||
// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the
 | 
			
		||||
// Prometheus server not to assume anything about its type.
 | 
			
		||||
//
 | 
			
		||||
// In addition to the fundamental metric types Gauge, Counter, Summary,
 | 
			
		||||
// Histogram, and Untyped, a very important part of the Prometheus data model is
 | 
			
		||||
// the partitioning of samples along dimensions called labels, which results in
 | 
			
		||||
// In addition to the fundamental metric types Gauge, Counter, Summary, and
 | 
			
		||||
// Histogram, a very important part of the Prometheus data model is the
 | 
			
		||||
// partitioning of samples along dimensions called labels, which results in
 | 
			
		||||
// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec,
 | 
			
		||||
// HistogramVec, and UntypedVec.
 | 
			
		||||
// and HistogramVec.
 | 
			
		||||
//
 | 
			
		||||
// While only the fundamental metric types implement the Metric interface, both
 | 
			
		||||
// the metrics and their vector versions implement the Collector interface. A
 | 
			
		||||
// Collector manages the collection of a number of Metrics, but for convenience,
 | 
			
		||||
// a Metric can also “collect itself”. Note that Gauge, Counter, Summary,
 | 
			
		||||
// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec,
 | 
			
		||||
// SummaryVec, HistogramVec, and UntypedVec are not.
 | 
			
		||||
// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, and
 | 
			
		||||
// Histogram are interfaces themselves while GaugeVec, CounterVec, SummaryVec,
 | 
			
		||||
// and HistogramVec are not.
 | 
			
		||||
//
 | 
			
		||||
// To create instances of Metrics and their vector versions, you need a suitable
 | 
			
		||||
// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, HistogramOpts, or
 | 
			
		||||
// UntypedOpts.
 | 
			
		||||
// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, or HistogramOpts.
 | 
			
		||||
//
 | 
			
		||||
// Custom Collectors and constant Metrics
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			@ -118,13 +114,16 @@
 | 
			
		|||
// existing numbers into Prometheus Metrics during collection. An own
 | 
			
		||||
// implementation of the Collector interface is perfect for that. You can create
 | 
			
		||||
// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and
 | 
			
		||||
// NewConstSummary (and their respective Must… versions). That will happen in
 | 
			
		||||
// the Collect method. The Describe method has to return separate Desc
 | 
			
		||||
// instances, representative of the “throw-away” metrics to be created later.
 | 
			
		||||
// NewDesc comes in handy to create those Desc instances. Alternatively, you
 | 
			
		||||
// could return no Desc at all, which will mark the Collector “unchecked”.  No
 | 
			
		||||
// checks are performed at registration time, but metric consistency will still
 | 
			
		||||
// be ensured at scrape time, i.e. any inconsistencies will lead to scrape
 | 
			
		||||
// NewConstSummary (and their respective Must… versions). NewConstMetric is used
 | 
			
		||||
// for all metric types with just a float64 as their value: Counter, Gauge, and
 | 
			
		||||
// a special “type” called Untyped. Use the latter if you are not sure if the
 | 
			
		||||
// mirrored metric is a Counter or a Gauge. Creation of the Metric instance
 | 
			
		||||
// happens in the Collect method. The Describe method has to return separate
 | 
			
		||||
// Desc instances, representative of the “throw-away” metrics to be created
 | 
			
		||||
// later.  NewDesc comes in handy to create those Desc instances. Alternatively,
 | 
			
		||||
// you could return no Desc at all, which will mark the Collector “unchecked”.
 | 
			
		||||
// No checks are performed at registration time, but metric consistency will
 | 
			
		||||
// still be ensured at scrape time, i.e. any inconsistencies will lead to scrape
 | 
			
		||||
// errors. Thus, with unchecked Collectors, the responsibility to not collect
 | 
			
		||||
// metrics that lead to inconsistencies in the total scrape result lies with the
 | 
			
		||||
// implementer of the Collector. While this is not a desirable state, it is
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										24
									
								
								vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -33,18 +33,22 @@ var (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
type processMemoryCounters struct {
 | 
			
		||||
	// https://docs.microsoft.com/en-us/windows/desktop/api/psapi/ns-psapi-_process_memory_counters_ex
 | 
			
		||||
	// System interface description
 | 
			
		||||
	// https://docs.microsoft.com/en-us/windows/desktop/api/psapi/ns-psapi-process_memory_counters_ex
 | 
			
		||||
 | 
			
		||||
	// Refer to the Golang internal implementation
 | 
			
		||||
	// https://golang.org/src/internal/syscall/windows/psapi_windows.go
 | 
			
		||||
	_                          uint32
 | 
			
		||||
	PageFaultCount             uint32
 | 
			
		||||
	PeakWorkingSetSize         uint64
 | 
			
		||||
	WorkingSetSize             uint64
 | 
			
		||||
	QuotaPeakPagedPoolUsage    uint64
 | 
			
		||||
	QuotaPagedPoolUsage        uint64
 | 
			
		||||
	QuotaPeakNonPagedPoolUsage uint64
 | 
			
		||||
	QuotaNonPagedPoolUsage     uint64
 | 
			
		||||
	PagefileUsage              uint64
 | 
			
		||||
	PeakPagefileUsage          uint64
 | 
			
		||||
	PrivateUsage               uint64
 | 
			
		||||
	PeakWorkingSetSize         uintptr
 | 
			
		||||
	WorkingSetSize             uintptr
 | 
			
		||||
	QuotaPeakPagedPoolUsage    uintptr
 | 
			
		||||
	QuotaPagedPoolUsage        uintptr
 | 
			
		||||
	QuotaPeakNonPagedPoolUsage uintptr
 | 
			
		||||
	QuotaNonPagedPoolUsage     uintptr
 | 
			
		||||
	PagefileUsage              uintptr
 | 
			
		||||
	PeakPagefileUsage          uintptr
 | 
			
		||||
	PrivateUsage               uintptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getProcessMemoryInfo(handle windows.Handle) (processMemoryCounters, error) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -53,12 +53,16 @@ func (r *responseWriterDelegator) Written() int64 {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (r *responseWriterDelegator) WriteHeader(code int) {
 | 
			
		||||
	if r.observeWriteHeader != nil && !r.wroteHeader {
 | 
			
		||||
		// Only call observeWriteHeader for the 1st time. It's a bug if
 | 
			
		||||
		// WriteHeader is called more than once, but we want to protect
 | 
			
		||||
		// against it here. Note that we still delegate the WriteHeader
 | 
			
		||||
		// to the original ResponseWriter to not mask the bug from it.
 | 
			
		||||
		r.observeWriteHeader(code)
 | 
			
		||||
	}
 | 
			
		||||
	r.status = code
 | 
			
		||||
	r.wroteHeader = true
 | 
			
		||||
	r.ResponseWriter.WriteHeader(code)
 | 
			
		||||
	if r.observeWriteHeader != nil {
 | 
			
		||||
		r.observeWriteHeader(code)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *responseWriterDelegator) Write(b []byte) (int, error) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										27
									
								
								vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -167,15 +167,12 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler {
 | 
			
		|||
 | 
			
		||||
		enc := expfmt.NewEncoder(w, contentType)
 | 
			
		||||
 | 
			
		||||
		var lastErr error
 | 
			
		||||
 | 
			
		||||
		// handleError handles the error according to opts.ErrorHandling
 | 
			
		||||
		// and returns true if we have to abort after the handling.
 | 
			
		||||
		handleError := func(err error) bool {
 | 
			
		||||
			if err == nil {
 | 
			
		||||
				return false
 | 
			
		||||
			}
 | 
			
		||||
			lastErr = err
 | 
			
		||||
			if opts.ErrorLog != nil {
 | 
			
		||||
				opts.ErrorLog.Println("error encoding and sending metric family:", err)
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +181,10 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler {
 | 
			
		|||
			case PanicOnError:
 | 
			
		||||
				panic(err)
 | 
			
		||||
			case HTTPErrorOnError:
 | 
			
		||||
				httpError(rsp, err)
 | 
			
		||||
				// We cannot really send an HTTP error at this
 | 
			
		||||
				// point because we most likely have written
 | 
			
		||||
				// something to rsp already. But at least we can
 | 
			
		||||
				// stop sending.
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
			// Do nothing in all other cases, including ContinueOnError.
 | 
			
		||||
| 
						 | 
				
			
			@ -202,10 +202,6 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler {
 | 
			
		|||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if lastErr != nil {
 | 
			
		||||
			httpError(rsp, lastErr)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	if opts.Timeout <= 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +272,12 @@ type HandlerErrorHandling int
 | 
			
		|||
// errors are encountered.
 | 
			
		||||
const (
 | 
			
		||||
	// Serve an HTTP status code 500 upon the first error
 | 
			
		||||
	// encountered. Report the error message in the body.
 | 
			
		||||
	// encountered. Report the error message in the body. Note that HTTP
 | 
			
		||||
	// errors cannot be served anymore once the beginning of a regular
 | 
			
		||||
	// payload has been sent. Thus, in the (unlikely) case that encoding the
 | 
			
		||||
	// payload into the negotiated wire format fails, serving the response
 | 
			
		||||
	// will simply be aborted. Set an ErrorLog in HandlerOpts to detect
 | 
			
		||||
	// those errors.
 | 
			
		||||
	HTTPErrorOnError HandlerErrorHandling = iota
 | 
			
		||||
	// Ignore errors and try to serve as many metrics as possible.  However,
 | 
			
		||||
	// if no metrics can be served, serve an HTTP status code 500 and the
 | 
			
		||||
| 
						 | 
				
			
			@ -365,11 +366,9 @@ func gzipAccepted(header http.Header) bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// httpError removes any content-encoding header and then calls http.Error with
 | 
			
		||||
// the provided error and http.StatusInternalServerErrer. Error contents is
 | 
			
		||||
// supposed to be uncompressed plain text. However, same as with a plain
 | 
			
		||||
// http.Error, any header settings will be void if the header has already been
 | 
			
		||||
// sent. The error message will still be written to the writer, but it will
 | 
			
		||||
// probably be of limited use.
 | 
			
		||||
// the provided error and http.StatusInternalServerError. Error contents is
 | 
			
		||||
// supposed to be uncompressed plain text. Same as with a plain http.Error, this
 | 
			
		||||
// must not be called if the header or any payload has already been sent.
 | 
			
		||||
func httpError(rsp http.ResponseWriter, err error) {
 | 
			
		||||
	rsp.Header().Del(contentEncodingHeader)
 | 
			
		||||
	http.Error(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								vendor/github.com/prometheus/client_golang/prometheus/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/prometheus/client_golang/prometheus/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -28,7 +28,8 @@ import (
 | 
			
		|||
// ValueType is an enumeration of metric types that represent a simple value.
 | 
			
		||||
type ValueType int
 | 
			
		||||
 | 
			
		||||
// Possible values for the ValueType enum.
 | 
			
		||||
// Possible values for the ValueType enum. Use UntypedValue to mark a metric
 | 
			
		||||
// with an unknown type.
 | 
			
		||||
const (
 | 
			
		||||
	_ ValueType = iota
 | 
			
		||||
	CounterValue
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								vendor/github.com/prometheus/client_golang/prometheus/vec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/prometheus/client_golang/prometheus/vec.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -91,6 +91,18 @@ func (m *metricVec) Delete(labels Labels) bool {
 | 
			
		|||
	return m.metricMap.deleteByHashWithLabels(h, labels, m.curry)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Without explicit forwarding of Describe, Collect, Reset, those methods won't
 | 
			
		||||
// show up in GoDoc.
 | 
			
		||||
 | 
			
		||||
// Describe implements Collector.
 | 
			
		||||
func (m *metricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(ch) }
 | 
			
		||||
 | 
			
		||||
// Collect implements Collector.
 | 
			
		||||
func (m *metricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) }
 | 
			
		||||
 | 
			
		||||
// Reset deletes all metrics in this vector.
 | 
			
		||||
func (m *metricVec) Reset() { m.metricMap.Reset() }
 | 
			
		||||
 | 
			
		||||
func (m *metricVec) curryWith(labels Labels) (*metricVec, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		newCurry []curriedLabelValue
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								vendor/github.com/prometheus/common/config/http_config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/prometheus/common/config/http_config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -29,6 +29,7 @@ import (
 | 
			
		|||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/mwitkow/go-conntrack"
 | 
			
		||||
	"golang.org/x/net/http2"
 | 
			
		||||
	"gopkg.in/yaml.v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -153,6 +154,11 @@ func NewRoundTripperFromConfig(cfg HTTPClientConfig, name string, disableKeepAli
 | 
			
		|||
				conntrack.DialWithName(name),
 | 
			
		||||
			),
 | 
			
		||||
		}
 | 
			
		||||
		// TODO: use ForceAttemptHTTP2 when we move to Go 1.13+.
 | 
			
		||||
		err := http2.ConfigureTransport(rt.(*http.Transport))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// If a bearer token is provided, create a round tripper that will set the
 | 
			
		||||
		// Authorization header correctly on each request.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								vendor/github.com/prometheus/common/model/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/prometheus/common/model/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -186,6 +186,10 @@ var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$")
 | 
			
		|||
// ParseDuration parses a string into a time.Duration, assuming that a year
 | 
			
		||||
// always has 365d, a week always has 7d, and a day always has 24h.
 | 
			
		||||
func ParseDuration(durationStr string) (Duration, error) {
 | 
			
		||||
	// Allow 0 without a unit.
 | 
			
		||||
	if durationStr == "0" {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	matches := durationRE.FindStringSubmatch(durationStr)
 | 
			
		||||
	if len(matches) != 3 {
 | 
			
		||||
		return 0, fmt.Errorf("not a valid duration string: %q", durationStr)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								vendor/github.com/prometheus/common/promlog/log.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/prometheus/common/promlog/log.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -94,13 +94,15 @@ type Config struct {
 | 
			
		|||
// with a timestamp. The output always goes to stderr.
 | 
			
		||||
func New(config *Config) log.Logger {
 | 
			
		||||
	var l log.Logger
 | 
			
		||||
	if config.Format.s == "logfmt" {
 | 
			
		||||
		l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
 | 
			
		||||
	} else {
 | 
			
		||||
	if config.Format != nil && config.Format.s == "json" {
 | 
			
		||||
		l = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
 | 
			
		||||
	} else {
 | 
			
		||||
		l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	l = level.NewFilter(l, config.Level.o)
 | 
			
		||||
	if config.Level != nil {
 | 
			
		||||
		l = level.NewFilter(l, config.Level.o)
 | 
			
		||||
	}
 | 
			
		||||
	l = log.With(l, "ts", timestampFormat, "caller", log.DefaultCaller)
 | 
			
		||||
	return l
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,4 @@
 | 
			
		|||
Copyright (c) 2013 The Go Authors. All rights reserved.
 | 
			
		||||
Copyright (c) 2016 Dominik Honnef. All rights reserved.
 | 
			
		||||
Copyright (c) 2020 Chris Siebenmann. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +10,7 @@ notice, this list of conditions and the following disclaimer.
 | 
			
		|||
copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
in the documentation and/or other materials provided with the
 | 
			
		||||
distribution.
 | 
			
		||||
   * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
   * Neither the name of Chris Siebenmann nor the names of its
 | 
			
		||||
contributors may be used to endorse or promote products derived from
 | 
			
		||||
this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/github.com/siebenmann/go-kstat/README
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/siebenmann/go-kstat/README
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -4,9 +4,6 @@ general information on kstats, see the kstat(1) and kstat(3kstat)
 | 
			
		|||
manpages. For more documentation on the details of the package, see
 | 
			
		||||
doc.go, kstat_solaris.go, types_solaris_amd64.go, and raw_solaris.go.
 | 
			
		||||
 | 
			
		||||
This package is quite young, so the API may well change as I and
 | 
			
		||||
other people gain experience with using it.
 | 
			
		||||
 | 
			
		||||
The API supports access to 'named' kstat statistics, IO statistics,
 | 
			
		||||
and the most common and useful sorts of 'raw' kstat statistics
 | 
			
		||||
(unix:0:sysinfo, unix:0:vminfo, unix:0:var, and mnt:*:mntinfo).
 | 
			
		||||
| 
						 | 
				
			
			@ -20,12 +17,25 @@ interacts with the Solaris kstat library and holds references to memory
 | 
			
		|||
that's been dynamically allocated in C.
 | 
			
		||||
 | 
			
		||||
See kstat-godoc.txt for a text dump of the full godoc for the package.
 | 
			
		||||
Unfortunately Go tool limitations appear to make it impossible to see
 | 
			
		||||
full package documentat on anything except a Solaris machine (including
 | 
			
		||||
https://godoc.org/, sadly).
 | 
			
		||||
Unfortunately Go tool limitations appear to make it impossible to
 | 
			
		||||
see full package documentation on anything except a Solaris machine
 | 
			
		||||
(including https://godoc.org/, sadly).
 | 
			
		||||
 | 
			
		||||
Bug reports and other contributions are highly welcome.
 | 
			
		||||
 | 
			
		||||
IMPORTANT NOTE (March 2020): We no longer use any Solaris or Illumos
 | 
			
		||||
based systems. This package worked fine for us while we had such systems
 | 
			
		||||
and I never found any bugs, but without Illumos systems I'm no longer
 | 
			
		||||
in a position to further update the package in any meaningful way. I
 | 
			
		||||
would be happy to pass this package to someone is still using Solaris
 | 
			
		||||
or Illumos based systems and so can actively develop it, if any further
 | 
			
		||||
development is necessary. I am happy to accept pull requests from people
 | 
			
		||||
with Illumos systems who can do the necessary testing and so on.
 | 
			
		||||
 | 
			
		||||
Given this, I don't currently expect to release an official version 1.0
 | 
			
		||||
of the package or update it to be a Go module. I would again be happy to
 | 
			
		||||
accept pull requests.
 | 
			
		||||
 | 
			
		||||
Author:
 | 
			
		||||
 | 
			
		||||
Chris Siebenmann
 | 
			
		||||
| 
						 | 
				
			
			@ -34,4 +44,5 @@ https://utcc.utoronto.ca/~cks/space/blog/
 | 
			
		|||
 | 
			
		||||
(and elsewhere)
 | 
			
		||||
 | 
			
		||||
Copyright: standard Go copyright
 | 
			
		||||
Copyright: BSD-3-Clause, see LICENSE
 | 
			
		||||
(This is the copyright used by Go and projects copying its license.)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								vendor/go.uber.org/atomic/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/go.uber.org/atomic/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
 | 
			
		|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 | 
			
		||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 | 
			
		||||
 | 
			
		||||
## [1.6.0] - 2020-02-24
 | 
			
		||||
### Changed
 | 
			
		||||
- Drop library dependency on `golang.org/x/{lint, tools}`.
 | 
			
		||||
 | 
			
		||||
## [1.5.1] - 2019-11-19
 | 
			
		||||
- Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together
 | 
			
		||||
  causing `CAS` to fail even though the old value matches.
 | 
			
		||||
| 
						 | 
				
			
			@ -48,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
			
		|||
 | 
			
		||||
- Initial release.
 | 
			
		||||
 | 
			
		||||
[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0
 | 
			
		||||
[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1
 | 
			
		||||
[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0
 | 
			
		||||
[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								vendor/go.uber.org/atomic/tools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/go.uber.org/atomic/tools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,28 +0,0 @@
 | 
			
		|||
// Copyright (c) 2019 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// +build tools
 | 
			
		||||
 | 
			
		||||
package atomic
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	// Tools used during development.
 | 
			
		||||
	_ "golang.org/x/lint/golint"
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/go.uber.org/multierr/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/go.uber.org/multierr/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,6 +1,12 @@
 | 
			
		|||
Releases
 | 
			
		||||
========
 | 
			
		||||
 | 
			
		||||
v1.5.0 (2020-02-24)
 | 
			
		||||
===================
 | 
			
		||||
 | 
			
		||||
-   Drop library dependency on development-time tooling.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
v1.4.0 (2019-11-04)
 | 
			
		||||
===================
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								vendor/go.uber.org/multierr/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/go.uber.org/multierr/error.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -130,7 +130,7 @@ type errorGroup interface {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Errors returns a slice containing zero or more errors that the supplied
 | 
			
		||||
// error is composed of. If the error is nil, the returned slice is empty.
 | 
			
		||||
// error is composed of. If the error is nil, a nil slice is returned.
 | 
			
		||||
//
 | 
			
		||||
// 	err := multierr.Append(r.Close(), w.Close())
 | 
			
		||||
// 	errors := multierr.Errors(err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								vendor/go.uber.org/multierr/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/go.uber.org/multierr/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -4,7 +4,7 @@ go 1.12
 | 
			
		|||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/stretchr/testify v1.3.0
 | 
			
		||||
	go.uber.org/atomic v1.5.0
 | 
			
		||||
	go.uber.org/atomic v1.6.0
 | 
			
		||||
	go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee
 | 
			
		||||
	golang.org/x/lint v0.0.0-20190930215403-16217165b5de
 | 
			
		||||
	golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 // indirect
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								vendor/go.uber.org/multierr/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/go.uber.org/multierr/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -15,8 +15,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 | 
			
		|||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
 | 
			
		||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
 | 
			
		||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
 | 
			
		||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								vendor/go.uber.org/multierr/tools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/go.uber.org/multierr/tools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,30 +0,0 @@
 | 
			
		|||
// Copyright (c) 2019 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// +build tools
 | 
			
		||||
 | 
			
		||||
package multierr
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	// Tools we use during development.
 | 
			
		||||
	_ "go.uber.org/tools/update-license"
 | 
			
		||||
	_ "golang.org/x/lint/golint"
 | 
			
		||||
	_ "honnef.co/go/tools/cmd/staticcheck"
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/go.uber.org/tools/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/go.uber.org/tools/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,19 +0,0 @@
 | 
			
		|||
Copyright (c) 2017 Uber Technologies, Inc.
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in
 | 
			
		||||
all copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
THE SOFTWARE.
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/go.uber.org/tools/update-license/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/go.uber.org/tools/update-license/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
update-license
 | 
			
		||||
							
								
								
									
										24
									
								
								vendor/go.uber.org/tools/update-license/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/go.uber.org/tools/update-license/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,24 +0,0 @@
 | 
			
		|||
# update-license
 | 
			
		||||
 | 
			
		||||
This is a small tool that updates the license header for Uber's open source Golang files.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
go get go.uber.org/tools/update-license
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
update-license go_files...
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Further Work
 | 
			
		||||
 | 
			
		||||
* Support more licenses by name (MIT, Apache 2.0, etc), file path, url (http GET)
 | 
			
		||||
* Support custom owner (not just "Uber Technologies, Inc.")
 | 
			
		||||
* Support more languages than go (cover go, java, js, py to start, along with LICENSE, LICENSE.txt)
 | 
			
		||||
* Talk about removing custom logic for header comments (ie `@generated`, `Code generated by`), it probably makes more sense just to put the license at the top
 | 
			
		||||
* Better detection support for existing licenses so they can be removed
 | 
			
		||||
* Verbose, dry run support
 | 
			
		||||
							
								
								
									
										56
									
								
								vendor/go.uber.org/tools/update-license/licenses.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								vendor/go.uber.org/tools/update-license/licenses.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,56 +0,0 @@
 | 
			
		|||
// Copyright (c) 2019 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
var licenseTemplates = map[string]string{
 | 
			
		||||
	"Apache-2.0": `// Copyright {{.Year}} {{.Owner}}
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//    http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.`,
 | 
			
		||||
	"MIT": `// Copyright (c) {{.Year}} {{.Owner}}
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.`,
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										228
									
								
								vendor/go.uber.org/tools/update-license/main.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										228
									
								
								vendor/go.uber.org/tools/update-license/main.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,228 +0,0 @@
 | 
			
		|||
// Copyright (c) 2019 Uber Technologies, Inc.
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
// of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
// in the Software without restriction, including without limitation the rights
 | 
			
		||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
// copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
// furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included in
 | 
			
		||||
// all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
			
		||||
// THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// how many lines to check for an existing copyright
 | 
			
		||||
	// this logic is not great and we should probably do something else
 | 
			
		||||
	// but this was copied from the python script
 | 
			
		||||
	copyrightLineLimit = 5
 | 
			
		||||
	headerPrefix       = "// Copyright"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	flagDryRun  = flag.Bool("dry", false, "Do not edit files and just print out what files would be edited")
 | 
			
		||||
	flagOwner   = flag.String("owner", "Uber Technologies, Inc.", "Copyright owner")
 | 
			
		||||
	flagLicense = flag.String(
 | 
			
		||||
		"license",
 | 
			
		||||
		"MIT",
 | 
			
		||||
		fmt.Sprintf(
 | 
			
		||||
			"Type of license to use [%s]",
 | 
			
		||||
			strings.Join(validLicenses(), ", "),
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	lineSkipPrefixes = []string{
 | 
			
		||||
		"// Code generated by",
 | 
			
		||||
		"// @generated",
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	log.SetFlags(0)
 | 
			
		||||
	log.SetOutput(os.Stdout)
 | 
			
		||||
	log.SetPrefix("")
 | 
			
		||||
	if err := do(); err != nil {
 | 
			
		||||
		log.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func do() error {
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	if len(flag.Args()) < 1 {
 | 
			
		||||
		return fmt.Errorf("usage: %s GO_FILES", os.Args[0])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return updateFiles(
 | 
			
		||||
		flag.Args(),
 | 
			
		||||
		time.Now().UTC().Year(),
 | 
			
		||||
		*flagLicense,
 | 
			
		||||
		*flagOwner,
 | 
			
		||||
		*flagDryRun,
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func fullLicense(ts string, year int, owner string) string {
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	t, err := template.New("").Parse(ts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panic("failed to parse license template", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data := struct {
 | 
			
		||||
		Year  int
 | 
			
		||||
		Owner string
 | 
			
		||||
	}{year, owner}
 | 
			
		||||
	if err := t.Execute(&buf, data); err != nil {
 | 
			
		||||
		log.Panic("failed to execture license template", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return strings.TrimSpace(buf.String())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// validLicenses grabs all the license templates from the folder
 | 
			
		||||
func validLicenses() []string {
 | 
			
		||||
	res := make([]string, 0, len(licenseTemplates))
 | 
			
		||||
 | 
			
		||||
	for k := range licenseTemplates {
 | 
			
		||||
		res = append(res, k)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sort.Strings(res)
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateFiles(
 | 
			
		||||
	filePaths []string,
 | 
			
		||||
	year int,
 | 
			
		||||
	license string,
 | 
			
		||||
	owner string,
 | 
			
		||||
	dryRun bool,
 | 
			
		||||
) error {
 | 
			
		||||
	if err := checkFilePaths(filePaths); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, filePath := range filePaths {
 | 
			
		||||
		if err := updateFile(filePath, year, license, owner, dryRun); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkFilePaths(filePaths []string) error {
 | 
			
		||||
	for _, filePath := range filePaths {
 | 
			
		||||
		if filepath.Ext(filePath) != ".go" {
 | 
			
		||||
			return fmt.Errorf("%s is not a go file", filePath)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateFile(
 | 
			
		||||
	filePath string,
 | 
			
		||||
	year int,
 | 
			
		||||
	license string,
 | 
			
		||||
	owner string,
 | 
			
		||||
	dryRun bool,
 | 
			
		||||
) error {
 | 
			
		||||
	data, err := ioutil.ReadFile(filePath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	newData := updateData(data, year, license, owner)
 | 
			
		||||
	if !bytes.Equal(data, newData) {
 | 
			
		||||
		if dryRun {
 | 
			
		||||
			log.Print(filePath)
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		// we could do something more complicated so that we do not
 | 
			
		||||
		// need to pass 0644 as the file mode, but in this case it should
 | 
			
		||||
		// never actually be used to create a file since we know the file
 | 
			
		||||
		// already exists, and it's easier to use the ReadFile/WriteFile
 | 
			
		||||
		// logic as it is right now, and since this is just a generation
 | 
			
		||||
		// program, this should be acceptable
 | 
			
		||||
		return ioutil.WriteFile(filePath, newData, 0644)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func updateData(
 | 
			
		||||
	data []byte,
 | 
			
		||||
	year int,
 | 
			
		||||
	license string,
 | 
			
		||||
	owner string,
 | 
			
		||||
) []byte {
 | 
			
		||||
	licenseText := fullLicense(string(licenseTemplates[license]), year, owner)
 | 
			
		||||
 | 
			
		||||
	return []byte(
 | 
			
		||||
		strings.Join(
 | 
			
		||||
			updateLines(strings.Split(string(data), "\n"), licenseText),
 | 
			
		||||
			"\n",
 | 
			
		||||
		),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// a value in the returned slice may contain newlines itself
 | 
			
		||||
func updateLines(lines []string, license string) []string {
 | 
			
		||||
	for i, line := range lines {
 | 
			
		||||
		if i >= copyrightLineLimit {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if strings.HasPrefix(line, headerPrefix) {
 | 
			
		||||
			// assume that the new license text always starts with the copyright
 | 
			
		||||
			// string. Pretty safe to assume, right? RIGHT?
 | 
			
		||||
			lines[i] = strings.Split(license, "\n")[0]
 | 
			
		||||
			return lines
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return addToLines(lines, license)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// a value in the returned slice may contain newlines itself
 | 
			
		||||
func addToLines(lines []string, license string) []string {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for len(lines) > i && lineContainsSkipPrefix(lines[i]) {
 | 
			
		||||
		i++
 | 
			
		||||
		// skip comments under the generated line too
 | 
			
		||||
		for strings.HasPrefix(lines[i], "//") {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if i == 0 {
 | 
			
		||||
		return append([]string{license, ""}, lines...)
 | 
			
		||||
	}
 | 
			
		||||
	return append(lines[0:i], append([]string{"", license}, lines[i:]...)...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lineContainsSkipPrefix(line string) bool {
 | 
			
		||||
	for _, skipPrefix := range lineSkipPrefixes {
 | 
			
		||||
		if strings.HasPrefix(line, skipPrefix) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/golang.org/x/lint/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/golang.org/x/lint/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,19 +0,0 @@
 | 
			
		|||
sudo: false
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - 1.10.x
 | 
			
		||||
  - 1.11.x
 | 
			
		||||
  - master
 | 
			
		||||
 | 
			
		||||
go_import_path: golang.org/x/lint
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - go get -t -v ./...
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - go test -v -race ./...
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
  allow_failures:
 | 
			
		||||
    - go: master
 | 
			
		||||
  fast_finish: true
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/golang.org/x/lint/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/golang.org/x/lint/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,15 +0,0 @@
 | 
			
		|||
# Contributing to Golint
 | 
			
		||||
 | 
			
		||||
## Before filing an issue:
 | 
			
		||||
 | 
			
		||||
### Are you having trouble building golint?
 | 
			
		||||
 | 
			
		||||
Check you have the latest version of its dependencies. Run
 | 
			
		||||
```
 | 
			
		||||
go get -u golang.org/x/lint/golint
 | 
			
		||||
```
 | 
			
		||||
If you still have problems, consider searching for existing issues before filing a new issue.
 | 
			
		||||
 | 
			
		||||
## Before sending a pull request:
 | 
			
		||||
 | 
			
		||||
Have you understood the purpose of golint? Make sure to carefully read `README`.
 | 
			
		||||
							
								
								
									
										88
									
								
								vendor/golang.org/x/lint/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								vendor/golang.org/x/lint/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,88 +0,0 @@
 | 
			
		|||
Golint is a linter for Go source code.
 | 
			
		||||
 | 
			
		||||
[](https://travis-ci.org/golang/lint)
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
Golint requires a
 | 
			
		||||
[supported release of Go](https://golang.org/doc/devel/release.html#policy).
 | 
			
		||||
 | 
			
		||||
    go get -u golang.org/x/lint/golint
 | 
			
		||||
 | 
			
		||||
To find out where `golint` was installed you can run `go list -f {{.Target}} golang.org/x/lint/golint`. For `golint` to be used globally add that directory to the `$PATH` environment setting.
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
Invoke `golint` with one or more filenames, directories, or packages named
 | 
			
		||||
by its import path. Golint uses the same
 | 
			
		||||
[import path syntax](https://golang.org/cmd/go/#hdr-Import_path_syntax) as
 | 
			
		||||
the `go` command and therefore
 | 
			
		||||
also supports relative import paths like `./...`. Additionally the `...`
 | 
			
		||||
wildcard can be used as suffix on relative and absolute file paths to recurse
 | 
			
		||||
into them.
 | 
			
		||||
 | 
			
		||||
The output of this tool is a list of suggestions in Vim quickfix format,
 | 
			
		||||
which is accepted by lots of different editors.
 | 
			
		||||
 | 
			
		||||
## Purpose
 | 
			
		||||
 | 
			
		||||
Golint differs from gofmt. Gofmt reformats Go source code, whereas
 | 
			
		||||
golint prints out style mistakes.
 | 
			
		||||
 | 
			
		||||
Golint differs from govet. Govet is concerned with correctness, whereas
 | 
			
		||||
golint is concerned with coding style. Golint is in use at Google, and it
 | 
			
		||||
seeks to match the accepted style of the open source Go project.
 | 
			
		||||
 | 
			
		||||
The suggestions made by golint are exactly that: suggestions.
 | 
			
		||||
Golint is not perfect, and has both false positives and false negatives.
 | 
			
		||||
Do not treat its output as a gold standard. We will not be adding pragmas
 | 
			
		||||
or other knobs to suppress specific warnings, so do not expect or require
 | 
			
		||||
code to be completely "lint-free".
 | 
			
		||||
In short, this tool is not, and will never be, trustworthy enough for its
 | 
			
		||||
suggestions to be enforced automatically, for example as part of a build process.
 | 
			
		||||
Golint makes suggestions for many of the mechanically checkable items listed in
 | 
			
		||||
[Effective Go](https://golang.org/doc/effective_go.html) and the
 | 
			
		||||
[CodeReviewComments wiki page](https://golang.org/wiki/CodeReviewComments).
 | 
			
		||||
 | 
			
		||||
## Scope
 | 
			
		||||
 | 
			
		||||
Golint is meant to carry out the stylistic conventions put forth in
 | 
			
		||||
[Effective Go](https://golang.org/doc/effective_go.html) and
 | 
			
		||||
[CodeReviewComments](https://golang.org/wiki/CodeReviewComments).
 | 
			
		||||
Changes that are not aligned with those documents will not be considered.
 | 
			
		||||
 | 
			
		||||
## Contributions
 | 
			
		||||
 | 
			
		||||
Contributions to this project are welcome provided they are [in scope](#scope),
 | 
			
		||||
though please send mail before starting work on anything major.
 | 
			
		||||
Contributors retain their copyright, so we need you to fill out
 | 
			
		||||
[a short form](https://developers.google.com/open-source/cla/individual)
 | 
			
		||||
before we can accept your contribution.
 | 
			
		||||
 | 
			
		||||
## Vim
 | 
			
		||||
 | 
			
		||||
Add this to your ~/.vimrc:
 | 
			
		||||
 | 
			
		||||
    set rtp+=$GOPATH/src/golang.org/x/lint/misc/vim
 | 
			
		||||
 | 
			
		||||
If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value.
 | 
			
		||||
 | 
			
		||||
Running `:Lint` will run golint on the current file and populate the quickfix list.
 | 
			
		||||
 | 
			
		||||
Optionally, add this to your `~/.vimrc` to automatically run `golint` on `:w`
 | 
			
		||||
 | 
			
		||||
    autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Emacs
 | 
			
		||||
 | 
			
		||||
Add this to your `.emacs` file:
 | 
			
		||||
 | 
			
		||||
    (add-to-list 'load-path (concat (getenv "GOPATH")  "/src/golang.org/x/lint/misc/emacs/"))
 | 
			
		||||
    (require 'golint)
 | 
			
		||||
 | 
			
		||||
If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value.
 | 
			
		||||
 | 
			
		||||
Running M-x golint will run golint on the current file.
 | 
			
		||||
 | 
			
		||||
For more usage, see [Compilation-Mode](http://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html).
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/golang.org/x/lint/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/golang.org/x/lint/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
module golang.org/x/lint
 | 
			
		||||
 | 
			
		||||
go 1.11
 | 
			
		||||
 | 
			
		||||
require golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/lint/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/lint/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,12 +0,0 @@
 | 
			
		|||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
 | 
			
		||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
							
								
								
									
										159
									
								
								vendor/golang.org/x/lint/golint/golint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										159
									
								
								vendor/golang.org/x/lint/golint/golint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,159 +0,0 @@
 | 
			
		|||
// Copyright (c) 2013 The Go Authors. All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file or at
 | 
			
		||||
// https://developers.google.com/open-source/licenses/bsd.
 | 
			
		||||
 | 
			
		||||
// golint lints the Go source files named on its command line.
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go/build"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/lint"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	minConfidence = flag.Float64("min_confidence", 0.8, "minimum confidence of a problem to print it")
 | 
			
		||||
	setExitStatus = flag.Bool("set_exit_status", false, "set exit status to 1 if any issues are found")
 | 
			
		||||
	suggestions   int
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func usage() {
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "\tgolint [flags] # runs on package in current directory\n")
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "\tgolint [flags] [packages]\n")
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "\tgolint [flags] [directories] # where a '/...' suffix includes all sub-directories\n")
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "\tgolint [flags] [files] # all must belong to a single package\n")
 | 
			
		||||
	fmt.Fprintf(os.Stderr, "Flags:\n")
 | 
			
		||||
	flag.PrintDefaults()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	flag.Usage = usage
 | 
			
		||||
	flag.Parse()
 | 
			
		||||
 | 
			
		||||
	if flag.NArg() == 0 {
 | 
			
		||||
		lintDir(".")
 | 
			
		||||
	} else {
 | 
			
		||||
		// dirsRun, filesRun, and pkgsRun indicate whether golint is applied to
 | 
			
		||||
		// directory, file or package targets. The distinction affects which
 | 
			
		||||
		// checks are run. It is no valid to mix target types.
 | 
			
		||||
		var dirsRun, filesRun, pkgsRun int
 | 
			
		||||
		var args []string
 | 
			
		||||
		for _, arg := range flag.Args() {
 | 
			
		||||
			if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) {
 | 
			
		||||
				dirsRun = 1
 | 
			
		||||
				for _, dirname := range allPackagesInFS(arg) {
 | 
			
		||||
					args = append(args, dirname)
 | 
			
		||||
				}
 | 
			
		||||
			} else if isDir(arg) {
 | 
			
		||||
				dirsRun = 1
 | 
			
		||||
				args = append(args, arg)
 | 
			
		||||
			} else if exists(arg) {
 | 
			
		||||
				filesRun = 1
 | 
			
		||||
				args = append(args, arg)
 | 
			
		||||
			} else {
 | 
			
		||||
				pkgsRun = 1
 | 
			
		||||
				args = append(args, arg)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if dirsRun+filesRun+pkgsRun != 1 {
 | 
			
		||||
			usage()
 | 
			
		||||
			os.Exit(2)
 | 
			
		||||
		}
 | 
			
		||||
		switch {
 | 
			
		||||
		case dirsRun == 1:
 | 
			
		||||
			for _, dir := range args {
 | 
			
		||||
				lintDir(dir)
 | 
			
		||||
			}
 | 
			
		||||
		case filesRun == 1:
 | 
			
		||||
			lintFiles(args...)
 | 
			
		||||
		case pkgsRun == 1:
 | 
			
		||||
			for _, pkg := range importPaths(args) {
 | 
			
		||||
				lintPackage(pkg)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if *setExitStatus && suggestions > 0 {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "Found %d lint suggestions; failing.\n", suggestions)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isDir(filename string) bool {
 | 
			
		||||
	fi, err := os.Stat(filename)
 | 
			
		||||
	return err == nil && fi.IsDir()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func exists(filename string) bool {
 | 
			
		||||
	_, err := os.Stat(filename)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lintFiles(filenames ...string) {
 | 
			
		||||
	files := make(map[string][]byte)
 | 
			
		||||
	for _, filename := range filenames {
 | 
			
		||||
		src, err := ioutil.ReadFile(filename)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Fprintln(os.Stderr, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		files[filename] = src
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	l := new(lint.Linter)
 | 
			
		||||
	ps, err := l.LintFiles(files)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "%v\n", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, p := range ps {
 | 
			
		||||
		if p.Confidence >= *minConfidence {
 | 
			
		||||
			fmt.Printf("%v: %s\n", p.Position, p.Text)
 | 
			
		||||
			suggestions++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lintDir(dirname string) {
 | 
			
		||||
	pkg, err := build.ImportDir(dirname, 0)
 | 
			
		||||
	lintImportedPackage(pkg, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lintPackage(pkgname string) {
 | 
			
		||||
	pkg, err := build.Import(pkgname, ".", 0)
 | 
			
		||||
	lintImportedPackage(pkg, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lintImportedPackage(pkg *build.Package, err error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if _, nogo := err.(*build.NoGoError); nogo {
 | 
			
		||||
			// Don't complain if the failure is due to no Go source files.
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Fprintln(os.Stderr, err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var files []string
 | 
			
		||||
	files = append(files, pkg.GoFiles...)
 | 
			
		||||
	files = append(files, pkg.CgoFiles...)
 | 
			
		||||
	files = append(files, pkg.TestGoFiles...)
 | 
			
		||||
	if pkg.Dir != "." {
 | 
			
		||||
		for i, f := range files {
 | 
			
		||||
			files[i] = filepath.Join(pkg.Dir, f)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// TODO(dsymonds): Do foo_test too (pkg.XTestGoFiles)
 | 
			
		||||
 | 
			
		||||
	lintFiles(files...)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										309
									
								
								vendor/golang.org/x/lint/golint/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										309
									
								
								vendor/golang.org/x/lint/golint/import.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,309 +0,0 @@
 | 
			
		|||
package main
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
This file holds a direct copy of the import path matching code of
 | 
			
		||||
https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be
 | 
			
		||||
replaced when https://golang.org/issue/8768 is resolved.
 | 
			
		||||
 | 
			
		||||
It has been updated to follow upstream changes in a few ways.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"go/build"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	buildContext = build.Default
 | 
			
		||||
	goroot       = filepath.Clean(runtime.GOROOT())
 | 
			
		||||
	gorootSrc    = filepath.Join(goroot, "src")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// importPathsNoDotExpansion returns the import paths to use for the given
 | 
			
		||||
// command line, but it does no ... expansion.
 | 
			
		||||
func importPathsNoDotExpansion(args []string) []string {
 | 
			
		||||
	if len(args) == 0 {
 | 
			
		||||
		return []string{"."}
 | 
			
		||||
	}
 | 
			
		||||
	var out []string
 | 
			
		||||
	for _, a := range args {
 | 
			
		||||
		// Arguments are supposed to be import paths, but
 | 
			
		||||
		// as a courtesy to Windows developers, rewrite \ to /
 | 
			
		||||
		// in command-line arguments.  Handles .\... and so on.
 | 
			
		||||
		if filepath.Separator == '\\' {
 | 
			
		||||
			a = strings.Replace(a, `\`, `/`, -1)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Put argument in canonical form, but preserve leading ./.
 | 
			
		||||
		if strings.HasPrefix(a, "./") {
 | 
			
		||||
			a = "./" + path.Clean(a)
 | 
			
		||||
			if a == "./." {
 | 
			
		||||
				a = "."
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			a = path.Clean(a)
 | 
			
		||||
		}
 | 
			
		||||
		if a == "all" || a == "std" {
 | 
			
		||||
			out = append(out, allPackages(a)...)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		out = append(out, a)
 | 
			
		||||
	}
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// importPaths returns the import paths to use for the given command line.
 | 
			
		||||
func importPaths(args []string) []string {
 | 
			
		||||
	args = importPathsNoDotExpansion(args)
 | 
			
		||||
	var out []string
 | 
			
		||||
	for _, a := range args {
 | 
			
		||||
		if strings.Contains(a, "...") {
 | 
			
		||||
			if build.IsLocalImport(a) {
 | 
			
		||||
				out = append(out, allPackagesInFS(a)...)
 | 
			
		||||
			} else {
 | 
			
		||||
				out = append(out, allPackages(a)...)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		out = append(out, a)
 | 
			
		||||
	}
 | 
			
		||||
	return out
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// matchPattern(pattern)(name) reports whether
 | 
			
		||||
// name matches pattern.  Pattern is a limited glob
 | 
			
		||||
// pattern in which '...' means 'any string' and there
 | 
			
		||||
// is no other special syntax.
 | 
			
		||||
func matchPattern(pattern string) func(name string) bool {
 | 
			
		||||
	re := regexp.QuoteMeta(pattern)
 | 
			
		||||
	re = strings.Replace(re, `\.\.\.`, `.*`, -1)
 | 
			
		||||
	// Special case: foo/... matches foo too.
 | 
			
		||||
	if strings.HasSuffix(re, `/.*`) {
 | 
			
		||||
		re = re[:len(re)-len(`/.*`)] + `(/.*)?`
 | 
			
		||||
	}
 | 
			
		||||
	reg := regexp.MustCompile(`^` + re + `$`)
 | 
			
		||||
	return func(name string) bool {
 | 
			
		||||
		return reg.MatchString(name)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// hasPathPrefix reports whether the path s begins with the
 | 
			
		||||
// elements in prefix.
 | 
			
		||||
func hasPathPrefix(s, prefix string) bool {
 | 
			
		||||
	switch {
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	case len(s) == len(prefix):
 | 
			
		||||
		return s == prefix
 | 
			
		||||
	case len(s) > len(prefix):
 | 
			
		||||
		if prefix != "" && prefix[len(prefix)-1] == '/' {
 | 
			
		||||
			return strings.HasPrefix(s, prefix)
 | 
			
		||||
		}
 | 
			
		||||
		return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// treeCanMatchPattern(pattern)(name) reports whether
 | 
			
		||||
// name or children of name can possibly match pattern.
 | 
			
		||||
// Pattern is the same limited glob accepted by matchPattern.
 | 
			
		||||
func treeCanMatchPattern(pattern string) func(name string) bool {
 | 
			
		||||
	wildCard := false
 | 
			
		||||
	if i := strings.Index(pattern, "..."); i >= 0 {
 | 
			
		||||
		wildCard = true
 | 
			
		||||
		pattern = pattern[:i]
 | 
			
		||||
	}
 | 
			
		||||
	return func(name string) bool {
 | 
			
		||||
		return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
 | 
			
		||||
			wildCard && strings.HasPrefix(name, pattern)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// allPackages returns all the packages that can be found
 | 
			
		||||
// under the $GOPATH directories and $GOROOT matching pattern.
 | 
			
		||||
// The pattern is either "all" (all packages), "std" (standard packages)
 | 
			
		||||
// or a path including "...".
 | 
			
		||||
func allPackages(pattern string) []string {
 | 
			
		||||
	pkgs := matchPackages(pattern)
 | 
			
		||||
	if len(pkgs) == 0 {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
 | 
			
		||||
	}
 | 
			
		||||
	return pkgs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func matchPackages(pattern string) []string {
 | 
			
		||||
	match := func(string) bool { return true }
 | 
			
		||||
	treeCanMatch := func(string) bool { return true }
 | 
			
		||||
	if pattern != "all" && pattern != "std" {
 | 
			
		||||
		match = matchPattern(pattern)
 | 
			
		||||
		treeCanMatch = treeCanMatchPattern(pattern)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	have := map[string]bool{
 | 
			
		||||
		"builtin": true, // ignore pseudo-package that exists only for documentation
 | 
			
		||||
	}
 | 
			
		||||
	if !buildContext.CgoEnabled {
 | 
			
		||||
		have["runtime/cgo"] = true // ignore during walk
 | 
			
		||||
	}
 | 
			
		||||
	var pkgs []string
 | 
			
		||||
 | 
			
		||||
	// Commands
 | 
			
		||||
	cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator)
 | 
			
		||||
	filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error {
 | 
			
		||||
		if err != nil || !fi.IsDir() || path == cmd {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		name := path[len(cmd):]
 | 
			
		||||
		if !treeCanMatch(name) {
 | 
			
		||||
			return filepath.SkipDir
 | 
			
		||||
		}
 | 
			
		||||
		// Commands are all in cmd/, not in subdirectories.
 | 
			
		||||
		if strings.Contains(name, string(filepath.Separator)) {
 | 
			
		||||
			return filepath.SkipDir
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// We use, e.g., cmd/gofmt as the pseudo import path for gofmt.
 | 
			
		||||
		name = "cmd/" + name
 | 
			
		||||
		if have[name] {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		have[name] = true
 | 
			
		||||
		if !match(name) {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		_, err = buildContext.ImportDir(path, 0)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if _, noGo := err.(*build.NoGoError); !noGo {
 | 
			
		||||
				log.Print(err)
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		pkgs = append(pkgs, name)
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	for _, src := range buildContext.SrcDirs() {
 | 
			
		||||
		if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		src = filepath.Clean(src) + string(filepath.Separator)
 | 
			
		||||
		root := src
 | 
			
		||||
		if pattern == "cmd" {
 | 
			
		||||
			root += "cmd" + string(filepath.Separator)
 | 
			
		||||
		}
 | 
			
		||||
		filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
 | 
			
		||||
			if err != nil || !fi.IsDir() || path == src {
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// Avoid .foo, _foo, and testdata directory trees.
 | 
			
		||||
			_, elem := filepath.Split(path)
 | 
			
		||||
			if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
 | 
			
		||||
				return filepath.SkipDir
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			name := filepath.ToSlash(path[len(src):])
 | 
			
		||||
			if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") {
 | 
			
		||||
				// The name "std" is only the standard library.
 | 
			
		||||
				// If the name is cmd, it's the root of the command tree.
 | 
			
		||||
				return filepath.SkipDir
 | 
			
		||||
			}
 | 
			
		||||
			if !treeCanMatch(name) {
 | 
			
		||||
				return filepath.SkipDir
 | 
			
		||||
			}
 | 
			
		||||
			if have[name] {
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			have[name] = true
 | 
			
		||||
			if !match(name) {
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			_, err = buildContext.ImportDir(path, 0)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if _, noGo := err.(*build.NoGoError); noGo {
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			pkgs = append(pkgs, name)
 | 
			
		||||
			return nil
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	return pkgs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// allPackagesInFS is like allPackages but is passed a pattern
 | 
			
		||||
// beginning ./ or ../, meaning it should scan the tree rooted
 | 
			
		||||
// at the given directory.  There are ... in the pattern too.
 | 
			
		||||
func allPackagesInFS(pattern string) []string {
 | 
			
		||||
	pkgs := matchPackagesInFS(pattern)
 | 
			
		||||
	if len(pkgs) == 0 {
 | 
			
		||||
		fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
 | 
			
		||||
	}
 | 
			
		||||
	return pkgs
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func matchPackagesInFS(pattern string) []string {
 | 
			
		||||
	// Find directory to begin the scan.
 | 
			
		||||
	// Could be smarter but this one optimization
 | 
			
		||||
	// is enough for now, since ... is usually at the
 | 
			
		||||
	// end of a path.
 | 
			
		||||
	i := strings.Index(pattern, "...")
 | 
			
		||||
	dir, _ := path.Split(pattern[:i])
 | 
			
		||||
 | 
			
		||||
	// pattern begins with ./ or ../.
 | 
			
		||||
	// path.Clean will discard the ./ but not the ../.
 | 
			
		||||
	// We need to preserve the ./ for pattern matching
 | 
			
		||||
	// and in the returned import paths.
 | 
			
		||||
	prefix := ""
 | 
			
		||||
	if strings.HasPrefix(pattern, "./") {
 | 
			
		||||
		prefix = "./"
 | 
			
		||||
	}
 | 
			
		||||
	match := matchPattern(pattern)
 | 
			
		||||
 | 
			
		||||
	var pkgs []string
 | 
			
		||||
	filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
 | 
			
		||||
		if err != nil || !fi.IsDir() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		if path == dir {
 | 
			
		||||
			// filepath.Walk starts at dir and recurses. For the recursive case,
 | 
			
		||||
			// the path is the result of filepath.Join, which calls filepath.Clean.
 | 
			
		||||
			// The initial case is not Cleaned, though, so we do this explicitly.
 | 
			
		||||
			//
 | 
			
		||||
			// This converts a path like "./io/" to "io". Without this step, running
 | 
			
		||||
			// "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io
 | 
			
		||||
			// package, because prepending the prefix "./" to the unclean path would
 | 
			
		||||
			// result in "././io", and match("././io") returns false.
 | 
			
		||||
			path = filepath.Clean(path)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..".
 | 
			
		||||
		_, elem := filepath.Split(path)
 | 
			
		||||
		dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
 | 
			
		||||
		if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
 | 
			
		||||
			return filepath.SkipDir
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		name := prefix + filepath.ToSlash(path)
 | 
			
		||||
		if !match(name) {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		if _, err = build.ImportDir(path, 0); err != nil {
 | 
			
		||||
			if _, noGo := err.(*build.NoGoError); !noGo {
 | 
			
		||||
				log.Print(err)
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		pkgs = append(pkgs, name)
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
	return pkgs
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/lint/golint/importcomment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/lint/golint/importcomment.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,13 +0,0 @@
 | 
			
		|||
// Copyright (c) 2018 The Go Authors. All rights reserved.
 | 
			
		||||
//
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file or at
 | 
			
		||||
// https://developers.google.com/open-source/licenses/bsd.
 | 
			
		||||
 | 
			
		||||
// +build go1.12
 | 
			
		||||
 | 
			
		||||
// Require use of the correct import path only for Go 1.12+ users, so
 | 
			
		||||
// any breakages coincide with people updating their CI configs or
 | 
			
		||||
// whatnot.
 | 
			
		||||
 | 
			
		||||
package main // import "golang.org/x/lint/golint"
 | 
			
		||||
							
								
								
									
										1614
									
								
								vendor/golang.org/x/lint/lint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1614
									
								
								vendor/golang.org/x/lint/lint.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										50
									
								
								vendor/golang.org/x/net/http/httpguts/guts.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/golang.org/x/net/http/httpguts/guts.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package httpguts provides functions implementing various details
 | 
			
		||||
// of the HTTP specification.
 | 
			
		||||
//
 | 
			
		||||
// This package is shared by the standard library (which vendors it)
 | 
			
		||||
// and x/net/http2. It comes with no API stability promise.
 | 
			
		||||
package httpguts
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net/textproto"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ValidTrailerHeader reports whether name is a valid header field name to appear
 | 
			
		||||
// in trailers.
 | 
			
		||||
// See RFC 7230, Section 4.1.2
 | 
			
		||||
func ValidTrailerHeader(name string) bool {
 | 
			
		||||
	name = textproto.CanonicalMIMEHeaderKey(name)
 | 
			
		||||
	if strings.HasPrefix(name, "If-") || badTrailer[name] {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var badTrailer = map[string]bool{
 | 
			
		||||
	"Authorization":       true,
 | 
			
		||||
	"Cache-Control":       true,
 | 
			
		||||
	"Connection":          true,
 | 
			
		||||
	"Content-Encoding":    true,
 | 
			
		||||
	"Content-Length":      true,
 | 
			
		||||
	"Content-Range":       true,
 | 
			
		||||
	"Content-Type":        true,
 | 
			
		||||
	"Expect":              true,
 | 
			
		||||
	"Host":                true,
 | 
			
		||||
	"Keep-Alive":          true,
 | 
			
		||||
	"Max-Forwards":        true,
 | 
			
		||||
	"Pragma":              true,
 | 
			
		||||
	"Proxy-Authenticate":  true,
 | 
			
		||||
	"Proxy-Authorization": true,
 | 
			
		||||
	"Proxy-Connection":    true,
 | 
			
		||||
	"Range":               true,
 | 
			
		||||
	"Realm":               true,
 | 
			
		||||
	"Te":                  true,
 | 
			
		||||
	"Trailer":             true,
 | 
			
		||||
	"Transfer-Encoding":   true,
 | 
			
		||||
	"Www-Authenticate":    true,
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										346
									
								
								vendor/golang.org/x/net/http/httpguts/httplex.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										346
									
								
								vendor/golang.org/x/net/http/httpguts/httplex.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,346 @@
 | 
			
		|||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package httpguts
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/idna"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var isTokenTable = [127]bool{
 | 
			
		||||
	'!':  true,
 | 
			
		||||
	'#':  true,
 | 
			
		||||
	'$':  true,
 | 
			
		||||
	'%':  true,
 | 
			
		||||
	'&':  true,
 | 
			
		||||
	'\'': true,
 | 
			
		||||
	'*':  true,
 | 
			
		||||
	'+':  true,
 | 
			
		||||
	'-':  true,
 | 
			
		||||
	'.':  true,
 | 
			
		||||
	'0':  true,
 | 
			
		||||
	'1':  true,
 | 
			
		||||
	'2':  true,
 | 
			
		||||
	'3':  true,
 | 
			
		||||
	'4':  true,
 | 
			
		||||
	'5':  true,
 | 
			
		||||
	'6':  true,
 | 
			
		||||
	'7':  true,
 | 
			
		||||
	'8':  true,
 | 
			
		||||
	'9':  true,
 | 
			
		||||
	'A':  true,
 | 
			
		||||
	'B':  true,
 | 
			
		||||
	'C':  true,
 | 
			
		||||
	'D':  true,
 | 
			
		||||
	'E':  true,
 | 
			
		||||
	'F':  true,
 | 
			
		||||
	'G':  true,
 | 
			
		||||
	'H':  true,
 | 
			
		||||
	'I':  true,
 | 
			
		||||
	'J':  true,
 | 
			
		||||
	'K':  true,
 | 
			
		||||
	'L':  true,
 | 
			
		||||
	'M':  true,
 | 
			
		||||
	'N':  true,
 | 
			
		||||
	'O':  true,
 | 
			
		||||
	'P':  true,
 | 
			
		||||
	'Q':  true,
 | 
			
		||||
	'R':  true,
 | 
			
		||||
	'S':  true,
 | 
			
		||||
	'T':  true,
 | 
			
		||||
	'U':  true,
 | 
			
		||||
	'W':  true,
 | 
			
		||||
	'V':  true,
 | 
			
		||||
	'X':  true,
 | 
			
		||||
	'Y':  true,
 | 
			
		||||
	'Z':  true,
 | 
			
		||||
	'^':  true,
 | 
			
		||||
	'_':  true,
 | 
			
		||||
	'`':  true,
 | 
			
		||||
	'a':  true,
 | 
			
		||||
	'b':  true,
 | 
			
		||||
	'c':  true,
 | 
			
		||||
	'd':  true,
 | 
			
		||||
	'e':  true,
 | 
			
		||||
	'f':  true,
 | 
			
		||||
	'g':  true,
 | 
			
		||||
	'h':  true,
 | 
			
		||||
	'i':  true,
 | 
			
		||||
	'j':  true,
 | 
			
		||||
	'k':  true,
 | 
			
		||||
	'l':  true,
 | 
			
		||||
	'm':  true,
 | 
			
		||||
	'n':  true,
 | 
			
		||||
	'o':  true,
 | 
			
		||||
	'p':  true,
 | 
			
		||||
	'q':  true,
 | 
			
		||||
	'r':  true,
 | 
			
		||||
	's':  true,
 | 
			
		||||
	't':  true,
 | 
			
		||||
	'u':  true,
 | 
			
		||||
	'v':  true,
 | 
			
		||||
	'w':  true,
 | 
			
		||||
	'x':  true,
 | 
			
		||||
	'y':  true,
 | 
			
		||||
	'z':  true,
 | 
			
		||||
	'|':  true,
 | 
			
		||||
	'~':  true,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func IsTokenRune(r rune) bool {
 | 
			
		||||
	i := int(r)
 | 
			
		||||
	return i < len(isTokenTable) && isTokenTable[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isNotToken(r rune) bool {
 | 
			
		||||
	return !IsTokenRune(r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HeaderValuesContainsToken reports whether any string in values
 | 
			
		||||
// contains the provided token, ASCII case-insensitively.
 | 
			
		||||
func HeaderValuesContainsToken(values []string, token string) bool {
 | 
			
		||||
	for _, v := range values {
 | 
			
		||||
		if headerValueContainsToken(v, token) {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isOWS reports whether b is an optional whitespace byte, as defined
 | 
			
		||||
// by RFC 7230 section 3.2.3.
 | 
			
		||||
func isOWS(b byte) bool { return b == ' ' || b == '\t' }
 | 
			
		||||
 | 
			
		||||
// trimOWS returns x with all optional whitespace removes from the
 | 
			
		||||
// beginning and end.
 | 
			
		||||
func trimOWS(x string) string {
 | 
			
		||||
	// TODO: consider using strings.Trim(x, " \t") instead,
 | 
			
		||||
	// if and when it's fast enough. See issue 10292.
 | 
			
		||||
	// But this ASCII-only code will probably always beat UTF-8
 | 
			
		||||
	// aware code.
 | 
			
		||||
	for len(x) > 0 && isOWS(x[0]) {
 | 
			
		||||
		x = x[1:]
 | 
			
		||||
	}
 | 
			
		||||
	for len(x) > 0 && isOWS(x[len(x)-1]) {
 | 
			
		||||
		x = x[:len(x)-1]
 | 
			
		||||
	}
 | 
			
		||||
	return x
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// headerValueContainsToken reports whether v (assumed to be a
 | 
			
		||||
// 0#element, in the ABNF extension described in RFC 7230 section 7)
 | 
			
		||||
// contains token amongst its comma-separated tokens, ASCII
 | 
			
		||||
// case-insensitively.
 | 
			
		||||
func headerValueContainsToken(v string, token string) bool {
 | 
			
		||||
	v = trimOWS(v)
 | 
			
		||||
	if comma := strings.IndexByte(v, ','); comma != -1 {
 | 
			
		||||
		return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token)
 | 
			
		||||
	}
 | 
			
		||||
	return tokenEqual(v, token)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// lowerASCII returns the ASCII lowercase version of b.
 | 
			
		||||
func lowerASCII(b byte) byte {
 | 
			
		||||
	if 'A' <= b && b <= 'Z' {
 | 
			
		||||
		return b + ('a' - 'A')
 | 
			
		||||
	}
 | 
			
		||||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// tokenEqual reports whether t1 and t2 are equal, ASCII case-insensitively.
 | 
			
		||||
func tokenEqual(t1, t2 string) bool {
 | 
			
		||||
	if len(t1) != len(t2) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	for i, b := range t1 {
 | 
			
		||||
		if b >= utf8.RuneSelf {
 | 
			
		||||
			// No UTF-8 or non-ASCII allowed in tokens.
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		if lowerASCII(byte(b)) != lowerASCII(t2[i]) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isLWS reports whether b is linear white space, according
 | 
			
		||||
// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
 | 
			
		||||
//      LWS            = [CRLF] 1*( SP | HT )
 | 
			
		||||
func isLWS(b byte) bool { return b == ' ' || b == '\t' }
 | 
			
		||||
 | 
			
		||||
// isCTL reports whether b is a control byte, according
 | 
			
		||||
// to http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
 | 
			
		||||
//      CTL            = <any US-ASCII control character
 | 
			
		||||
//                       (octets 0 - 31) and DEL (127)>
 | 
			
		||||
func isCTL(b byte) bool {
 | 
			
		||||
	const del = 0x7f // a CTL
 | 
			
		||||
	return b < ' ' || b == del
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidHeaderFieldName reports whether v is a valid HTTP/1.x header name.
 | 
			
		||||
// HTTP/2 imposes the additional restriction that uppercase ASCII
 | 
			
		||||
// letters are not allowed.
 | 
			
		||||
//
 | 
			
		||||
//  RFC 7230 says:
 | 
			
		||||
//   header-field   = field-name ":" OWS field-value OWS
 | 
			
		||||
//   field-name     = token
 | 
			
		||||
//   token          = 1*tchar
 | 
			
		||||
//   tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
 | 
			
		||||
//           "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
 | 
			
		||||
func ValidHeaderFieldName(v string) bool {
 | 
			
		||||
	if len(v) == 0 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	for _, r := range v {
 | 
			
		||||
		if !IsTokenRune(r) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidHostHeader reports whether h is a valid host header.
 | 
			
		||||
func ValidHostHeader(h string) bool {
 | 
			
		||||
	// The latest spec is actually this:
 | 
			
		||||
	//
 | 
			
		||||
	// http://tools.ietf.org/html/rfc7230#section-5.4
 | 
			
		||||
	//     Host = uri-host [ ":" port ]
 | 
			
		||||
	//
 | 
			
		||||
	// Where uri-host is:
 | 
			
		||||
	//     http://tools.ietf.org/html/rfc3986#section-3.2.2
 | 
			
		||||
	//
 | 
			
		||||
	// But we're going to be much more lenient for now and just
 | 
			
		||||
	// search for any byte that's not a valid byte in any of those
 | 
			
		||||
	// expressions.
 | 
			
		||||
	for i := 0; i < len(h); i++ {
 | 
			
		||||
		if !validHostByte[h[i]] {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// See the validHostHeader comment.
 | 
			
		||||
var validHostByte = [256]bool{
 | 
			
		||||
	'0': true, '1': true, '2': true, '3': true, '4': true, '5': true, '6': true, '7': true,
 | 
			
		||||
	'8': true, '9': true,
 | 
			
		||||
 | 
			
		||||
	'a': true, 'b': true, 'c': true, 'd': true, 'e': true, 'f': true, 'g': true, 'h': true,
 | 
			
		||||
	'i': true, 'j': true, 'k': true, 'l': true, 'm': true, 'n': true, 'o': true, 'p': true,
 | 
			
		||||
	'q': true, 'r': true, 's': true, 't': true, 'u': true, 'v': true, 'w': true, 'x': true,
 | 
			
		||||
	'y': true, 'z': true,
 | 
			
		||||
 | 
			
		||||
	'A': true, 'B': true, 'C': true, 'D': true, 'E': true, 'F': true, 'G': true, 'H': true,
 | 
			
		||||
	'I': true, 'J': true, 'K': true, 'L': true, 'M': true, 'N': true, 'O': true, 'P': true,
 | 
			
		||||
	'Q': true, 'R': true, 'S': true, 'T': true, 'U': true, 'V': true, 'W': true, 'X': true,
 | 
			
		||||
	'Y': true, 'Z': true,
 | 
			
		||||
 | 
			
		||||
	'!':  true, // sub-delims
 | 
			
		||||
	'$':  true, // sub-delims
 | 
			
		||||
	'%':  true, // pct-encoded (and used in IPv6 zones)
 | 
			
		||||
	'&':  true, // sub-delims
 | 
			
		||||
	'(':  true, // sub-delims
 | 
			
		||||
	')':  true, // sub-delims
 | 
			
		||||
	'*':  true, // sub-delims
 | 
			
		||||
	'+':  true, // sub-delims
 | 
			
		||||
	',':  true, // sub-delims
 | 
			
		||||
	'-':  true, // unreserved
 | 
			
		||||
	'.':  true, // unreserved
 | 
			
		||||
	':':  true, // IPv6address + Host expression's optional port
 | 
			
		||||
	';':  true, // sub-delims
 | 
			
		||||
	'=':  true, // sub-delims
 | 
			
		||||
	'[':  true,
 | 
			
		||||
	'\'': true, // sub-delims
 | 
			
		||||
	']':  true,
 | 
			
		||||
	'_':  true, // unreserved
 | 
			
		||||
	'~':  true, // unreserved
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ValidHeaderFieldValue reports whether v is a valid "field-value" according to
 | 
			
		||||
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 :
 | 
			
		||||
//
 | 
			
		||||
//        message-header = field-name ":" [ field-value ]
 | 
			
		||||
//        field-value    = *( field-content | LWS )
 | 
			
		||||
//        field-content  = <the OCTETs making up the field-value
 | 
			
		||||
//                         and consisting of either *TEXT or combinations
 | 
			
		||||
//                         of token, separators, and quoted-string>
 | 
			
		||||
//
 | 
			
		||||
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 :
 | 
			
		||||
//
 | 
			
		||||
//        TEXT           = <any OCTET except CTLs,
 | 
			
		||||
//                          but including LWS>
 | 
			
		||||
//        LWS            = [CRLF] 1*( SP | HT )
 | 
			
		||||
//        CTL            = <any US-ASCII control character
 | 
			
		||||
//                         (octets 0 - 31) and DEL (127)>
 | 
			
		||||
//
 | 
			
		||||
// RFC 7230 says:
 | 
			
		||||
//  field-value    = *( field-content / obs-fold )
 | 
			
		||||
//  obj-fold       =  N/A to http2, and deprecated
 | 
			
		||||
//  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
 | 
			
		||||
//  field-vchar    = VCHAR / obs-text
 | 
			
		||||
//  obs-text       = %x80-FF
 | 
			
		||||
//  VCHAR          = "any visible [USASCII] character"
 | 
			
		||||
//
 | 
			
		||||
// http2 further says: "Similarly, HTTP/2 allows header field values
 | 
			
		||||
// that are not valid. While most of the values that can be encoded
 | 
			
		||||
// will not alter header field parsing, carriage return (CR, ASCII
 | 
			
		||||
// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII
 | 
			
		||||
// 0x0) might be exploited by an attacker if they are translated
 | 
			
		||||
// verbatim. Any request or response that contains a character not
 | 
			
		||||
// permitted in a header field value MUST be treated as malformed
 | 
			
		||||
// (Section 8.1.2.6). Valid characters are defined by the
 | 
			
		||||
// field-content ABNF rule in Section 3.2 of [RFC7230]."
 | 
			
		||||
//
 | 
			
		||||
// This function does not (yet?) properly handle the rejection of
 | 
			
		||||
// strings that begin or end with SP or HTAB.
 | 
			
		||||
func ValidHeaderFieldValue(v string) bool {
 | 
			
		||||
	for i := 0; i < len(v); i++ {
 | 
			
		||||
		b := v[i]
 | 
			
		||||
		if isCTL(b) && !isLWS(b) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isASCII(s string) bool {
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		if s[i] >= utf8.RuneSelf {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PunycodeHostPort returns the IDNA Punycode version
 | 
			
		||||
// of the provided "host" or "host:port" string.
 | 
			
		||||
func PunycodeHostPort(v string) (string, error) {
 | 
			
		||||
	if isASCII(v) {
 | 
			
		||||
		return v, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	host, port, err := net.SplitHostPort(v)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// The input 'v' argument was just a "host" argument,
 | 
			
		||||
		// without a port. This error should not be returned
 | 
			
		||||
		// to the caller.
 | 
			
		||||
		host = v
 | 
			
		||||
		port = ""
 | 
			
		||||
	}
 | 
			
		||||
	host, err = idna.ToASCII(host)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// Non-UTF-8? Not representable in Punycode, in any
 | 
			
		||||
		// case.
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	if port == "" {
 | 
			
		||||
		return host, nil
 | 
			
		||||
	}
 | 
			
		||||
	return net.JoinHostPort(host, port), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/net/http2/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/net/http2/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
*~
 | 
			
		||||
h2i/h2i
 | 
			
		||||
							
								
								
									
										51
									
								
								vendor/golang.org/x/net/http2/Dockerfile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/golang.org/x/net/http2/Dockerfile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
#
 | 
			
		||||
# This Dockerfile builds a recent curl with HTTP/2 client support, using
 | 
			
		||||
# a recent nghttp2 build.
 | 
			
		||||
#
 | 
			
		||||
# See the Makefile for how to tag it. If Docker and that image is found, the
 | 
			
		||||
# Go tests use this curl binary for integration tests.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
FROM ubuntu:trusty
 | 
			
		||||
 | 
			
		||||
RUN apt-get update && \
 | 
			
		||||
    apt-get upgrade -y && \
 | 
			
		||||
    apt-get install -y git-core build-essential wget
 | 
			
		||||
 | 
			
		||||
RUN apt-get install -y --no-install-recommends \
 | 
			
		||||
       autotools-dev libtool pkg-config zlib1g-dev \
 | 
			
		||||
       libcunit1-dev libssl-dev libxml2-dev libevent-dev \
 | 
			
		||||
       automake autoconf
 | 
			
		||||
 | 
			
		||||
# The list of packages nghttp2 recommends for h2load:
 | 
			
		||||
RUN apt-get install -y --no-install-recommends make binutils \
 | 
			
		||||
        autoconf automake autotools-dev \
 | 
			
		||||
        libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \
 | 
			
		||||
        libev-dev libevent-dev libjansson-dev libjemalloc-dev \
 | 
			
		||||
        cython python3.4-dev python-setuptools
 | 
			
		||||
 | 
			
		||||
# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached:
 | 
			
		||||
ENV NGHTTP2_VER 895da9a
 | 
			
		||||
RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git
 | 
			
		||||
 | 
			
		||||
WORKDIR /root/nghttp2
 | 
			
		||||
RUN git reset --hard $NGHTTP2_VER
 | 
			
		||||
RUN autoreconf -i
 | 
			
		||||
RUN automake
 | 
			
		||||
RUN autoconf
 | 
			
		||||
RUN ./configure
 | 
			
		||||
RUN make
 | 
			
		||||
RUN make install
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz
 | 
			
		||||
RUN tar -zxvf curl-7.45.0.tar.gz
 | 
			
		||||
WORKDIR /root/curl-7.45.0
 | 
			
		||||
RUN ./configure --with-ssl --with-nghttp2=/usr/local
 | 
			
		||||
RUN make
 | 
			
		||||
RUN make install
 | 
			
		||||
RUN ldconfig
 | 
			
		||||
 | 
			
		||||
CMD ["-h"]
 | 
			
		||||
ENTRYPOINT ["/usr/local/bin/curl"]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/net/http2/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/net/http2/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
curlimage:
 | 
			
		||||
	docker build -t gohttp2/curl .
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/net/http2/README
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/net/http2/README
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
This is a work-in-progress HTTP/2 implementation for Go.
 | 
			
		||||
 | 
			
		||||
It will eventually live in the Go standard library and won't require
 | 
			
		||||
any changes to your code to use.  It will just be automatic.
 | 
			
		||||
 | 
			
		||||
Status:
 | 
			
		||||
 | 
			
		||||
* The server support is pretty good. A few things are missing
 | 
			
		||||
  but are being worked on.
 | 
			
		||||
* The client work has just started but shares a lot of code
 | 
			
		||||
  is coming along much quicker.
 | 
			
		||||
 | 
			
		||||
Docs are at https://godoc.org/golang.org/x/net/http2
 | 
			
		||||
 | 
			
		||||
Demo test server at https://http2.golang.org/
 | 
			
		||||
 | 
			
		||||
Help & bug reports welcome!
 | 
			
		||||
 | 
			
		||||
Contributing: https://golang.org/doc/contribute.html
 | 
			
		||||
Bugs:         https://golang.org/issue/new?title=x/net/http2:+
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue