mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 18:12:25 -06:00 
			
		
		
		
	[chore] update dependencies, bump to Go 1.19.1 (#826)
* update dependencies, bump Go version to 1.19 * bump test image Go version * update golangci-lint * update gotosocial-drone-build * sign * linting, go fmt * update swagger docs * update swagger docs * whitespace * update contributing.md * fuckin whoopsie doopsie * linterino, linteroni * fix followrequest test not starting processor * fix other api/client tests not starting processor * fix remaining tests where processor not started * bump go-runners version * don't check last-webfingered-at, processor may have updated this * update swagger command * update bun to latest version * fix embed to work the same as before with new bun Signed-off-by: kim <grufwub@gmail.com> Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
This commit is contained in:
		
					parent
					
						
							
								00d38855d4
							
						
					
				
			
			
				commit
				
					
						a156188b3e
					
				
			
		
					 1135 changed files with 258905 additions and 137146 deletions
				
			
		
							
								
								
									
										12
									
								
								vendor/github.com/pelletier/go-toml/v2/.goreleaser.yaml
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/pelletier/go-toml/v2/.goreleaser.yaml
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -16,7 +16,11 @@ builds:
 | 
			
		|||
    mod_timestamp: '{{ .CommitTimestamp }}'
 | 
			
		||||
    targets:
 | 
			
		||||
      - linux_amd64
 | 
			
		||||
      - linux_arm64
 | 
			
		||||
      - linux_arm
 | 
			
		||||
      - windows_amd64
 | 
			
		||||
      - windows_arm64
 | 
			
		||||
      - windows_arm
 | 
			
		||||
      - darwin_amd64
 | 
			
		||||
      - darwin_arm64
 | 
			
		||||
  - id: tomljson
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +35,11 @@ builds:
 | 
			
		|||
    mod_timestamp: '{{ .CommitTimestamp }}'
 | 
			
		||||
    targets:
 | 
			
		||||
      - linux_amd64
 | 
			
		||||
      - linux_arm64
 | 
			
		||||
      - linux_arm
 | 
			
		||||
      - windows_amd64
 | 
			
		||||
      - windows_arm64
 | 
			
		||||
      - windows_arm
 | 
			
		||||
      - darwin_amd64
 | 
			
		||||
      - darwin_arm64
 | 
			
		||||
  - id: jsontoml
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +54,11 @@ builds:
 | 
			
		|||
    mod_timestamp: '{{ .CommitTimestamp }}'
 | 
			
		||||
    targets:
 | 
			
		||||
      - linux_amd64
 | 
			
		||||
      - linux_arm64
 | 
			
		||||
      - linux_arm
 | 
			
		||||
      - windows_amd64
 | 
			
		||||
      - windows_arm64
 | 
			
		||||
      - windows_arm
 | 
			
		||||
      - darwin_amd64
 | 
			
		||||
      - darwin_arm64
 | 
			
		||||
universal_binaries:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										9
									
								
								vendor/github.com/pelletier/go-toml/v2/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/pelletier/go-toml/v2/README.md
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -38,7 +38,7 @@ operations should not be shockingly slow. See [benchmarks](#benchmarks).
 | 
			
		|||
### Strict mode
 | 
			
		||||
 | 
			
		||||
`Decoder` can be set to "strict mode", which makes it error when some parts of
 | 
			
		||||
the TOML document was not prevent in the target structure. This is a great way
 | 
			
		||||
the TOML document was not present in the target structure. This is a great way
 | 
			
		||||
to check for typos. [See example in the documentation][strict].
 | 
			
		||||
 | 
			
		||||
[strict]: https://pkg.go.dev/github.com/pelletier/go-toml/v2#example-Decoder.DisallowUnknownFields
 | 
			
		||||
| 
						 | 
				
			
			@ -540,6 +540,13 @@ complete solutions exist out there.
 | 
			
		|||
[query]: https://github.com/pelletier/go-toml/tree/f99d6bbca119636aeafcf351ee52b3d202782627/query
 | 
			
		||||
[dasel]: https://github.com/TomWright/dasel
 | 
			
		||||
 | 
			
		||||
## Versioning
 | 
			
		||||
 | 
			
		||||
Go-toml follows [Semantic Versioning](http://semver.org/). The supported version
 | 
			
		||||
of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of
 | 
			
		||||
this document. The last two major versions of Go are supported
 | 
			
		||||
(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)).
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
The MIT License (MIT). Read [LICENSE](LICENSE).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								vendor/github.com/pelletier/go-toml/v2/errors.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/pelletier/go-toml/v2/errors.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -103,6 +103,7 @@ func (e *DecodeError) Key() Key {
 | 
			
		|||
//
 | 
			
		||||
// The function copies all bytes used in DecodeError, so that document and
 | 
			
		||||
// highlight can be freely deallocated.
 | 
			
		||||
//
 | 
			
		||||
//nolint:funlen
 | 
			
		||||
func wrapDecodeError(document []byte, de *decodeError) *DecodeError {
 | 
			
		||||
	offset := danger.SubsliceOffset(document, de.highlight)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										8
									
								
								vendor/github.com/pelletier/go-toml/v2/internal/ast/ast.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/pelletier/go-toml/v2/internal/ast/ast.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -11,10 +11,10 @@ import (
 | 
			
		|||
//
 | 
			
		||||
// For example:
 | 
			
		||||
//
 | 
			
		||||
// it := n.Children()
 | 
			
		||||
// for it.Next() {
 | 
			
		||||
// 		it.Node()
 | 
			
		||||
// }
 | 
			
		||||
//	it := n.Children()
 | 
			
		||||
//	for it.Next() {
 | 
			
		||||
//			it.Node()
 | 
			
		||||
//	}
 | 
			
		||||
type Iterator struct {
 | 
			
		||||
	started bool
 | 
			
		||||
	node    *Node
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										122
									
								
								vendor/github.com/pelletier/go-toml/v2/marshaler.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										122
									
								
								vendor/github.com/pelletier/go-toml/v2/marshaler.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -54,7 +54,7 @@ func NewEncoder(w io.Writer) *Encoder {
 | 
			
		|||
// This behavior can be controlled on an individual struct field basis with the
 | 
			
		||||
// inline tag:
 | 
			
		||||
//
 | 
			
		||||
//   MyField `inline:"true"`
 | 
			
		||||
//	MyField `toml:",inline"`
 | 
			
		||||
func (enc *Encoder) SetTablesInline(inline bool) *Encoder {
 | 
			
		||||
	enc.tablesInline = inline
 | 
			
		||||
	return enc
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ func (enc *Encoder) SetTablesInline(inline bool) *Encoder {
 | 
			
		|||
//
 | 
			
		||||
// This behavior can be controlled on an individual struct field basis with the multiline tag:
 | 
			
		||||
//
 | 
			
		||||
//   MyField `multiline:"true"`
 | 
			
		||||
//	MyField `multiline:"true"`
 | 
			
		||||
func (enc *Encoder) SetArraysMultiline(multiline bool) *Encoder {
 | 
			
		||||
	enc.arraysMultiline = multiline
 | 
			
		||||
	return enc
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ func (enc *Encoder) SetIndentTables(indent bool) *Encoder {
 | 
			
		|||
//
 | 
			
		||||
// If v cannot be represented to TOML it returns an error.
 | 
			
		||||
//
 | 
			
		||||
// Encoding rules
 | 
			
		||||
// # Encoding rules
 | 
			
		||||
//
 | 
			
		||||
// A top level slice containing only maps or structs is encoded as [[table
 | 
			
		||||
// array]].
 | 
			
		||||
| 
						 | 
				
			
			@ -107,10 +107,30 @@ func (enc *Encoder) SetIndentTables(indent bool) *Encoder {
 | 
			
		|||
// a newline character or a single quote. In that case they are emitted as
 | 
			
		||||
// quoted strings.
 | 
			
		||||
//
 | 
			
		||||
// Unsigned integers larger than math.MaxInt64 cannot be encoded. Doing so
 | 
			
		||||
// results in an error. This rule exists because the TOML specification only
 | 
			
		||||
// requires parsers to support at least the 64 bits integer range. Allowing
 | 
			
		||||
// larger numbers would create non-standard TOML documents, which may not be
 | 
			
		||||
// readable (at best) by other implementations. To encode such numbers, a
 | 
			
		||||
// solution is a custom type that implements encoding.TextMarshaler.
 | 
			
		||||
//
 | 
			
		||||
// When encoding structs, fields are encoded in order of definition, with their
 | 
			
		||||
// exact name.
 | 
			
		||||
//
 | 
			
		||||
// Struct tags
 | 
			
		||||
// Tables and array tables are separated by empty lines. However, consecutive
 | 
			
		||||
// subtables definitions are not. For example:
 | 
			
		||||
//
 | 
			
		||||
//	[top1]
 | 
			
		||||
//
 | 
			
		||||
//	[top2]
 | 
			
		||||
//	[top2.child1]
 | 
			
		||||
//
 | 
			
		||||
//	[[array]]
 | 
			
		||||
//
 | 
			
		||||
//	[[array]]
 | 
			
		||||
//	[array.child2]
 | 
			
		||||
//
 | 
			
		||||
// # Struct tags
 | 
			
		||||
//
 | 
			
		||||
// The encoding of each public struct field can be customized by the format
 | 
			
		||||
// string in the "toml" key of the struct field's tag. This follows
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +148,8 @@ func (enc *Encoder) SetIndentTables(indent bool) *Encoder {
 | 
			
		|||
//
 | 
			
		||||
// In addition to the "toml" tag struct tag, a "comment" tag can be used to emit
 | 
			
		||||
// a TOML comment before the value being annotated. Comments are ignored inside
 | 
			
		||||
// inline tables.
 | 
			
		||||
// inline tables. For array tables, the comment is only present before the first
 | 
			
		||||
// element of the array.
 | 
			
		||||
func (enc *Encoder) Encode(v interface{}) error {
 | 
			
		||||
	var (
 | 
			
		||||
		b   []byte
 | 
			
		||||
| 
						 | 
				
			
			@ -302,7 +323,11 @@ func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, e
 | 
			
		|||
			b = append(b, "false"...)
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Uint64, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint:
 | 
			
		||||
		b = strconv.AppendUint(b, v.Uint(), 10)
 | 
			
		||||
		x := v.Uint()
 | 
			
		||||
		if x > uint64(math.MaxInt64) {
 | 
			
		||||
			return nil, fmt.Errorf("toml: not encoding uint (%d) greater than max int64 (%d)", x, int64(math.MaxInt64))
 | 
			
		||||
		}
 | 
			
		||||
		b = strconv.AppendUint(b, x, 10)
 | 
			
		||||
	case reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int:
 | 
			
		||||
		b = strconv.AppendInt(b, v.Int(), 10)
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			@ -321,13 +346,13 @@ func isNil(v reflect.Value) bool {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func shouldOmitEmpty(options valueOptions, v reflect.Value) bool {
 | 
			
		||||
	return options.omitempty && isEmptyValue(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) encodeKv(b []byte, ctx encoderCtx, options valueOptions, v reflect.Value) ([]byte, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	if (ctx.options.omitempty || options.omitempty) && isEmptyValue(v) {
 | 
			
		||||
		return b, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !ctx.inline {
 | 
			
		||||
		b = enc.encodeComment(ctx.indent, options.comment, b)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -353,6 +378,8 @@ func (enc *Encoder) encodeKv(b []byte, ctx encoderCtx, options valueOptions, v r
 | 
			
		|||
 | 
			
		||||
func isEmptyValue(v reflect.Value) bool {
 | 
			
		||||
	switch v.Kind() {
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
		return isEmptyStruct(v)
 | 
			
		||||
	case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
 | 
			
		||||
		return v.Len() == 0
 | 
			
		||||
	case reflect.Bool:
 | 
			
		||||
| 
						 | 
				
			
			@ -369,6 +396,34 @@ func isEmptyValue(v reflect.Value) bool {
 | 
			
		|||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isEmptyStruct(v reflect.Value) bool {
 | 
			
		||||
	// TODO: merge with walkStruct and cache.
 | 
			
		||||
	typ := v.Type()
 | 
			
		||||
	for i := 0; i < typ.NumField(); i++ {
 | 
			
		||||
		fieldType := typ.Field(i)
 | 
			
		||||
 | 
			
		||||
		// only consider exported fields
 | 
			
		||||
		if fieldType.PkgPath != "" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		tag := fieldType.Tag.Get("toml")
 | 
			
		||||
 | 
			
		||||
		// special field name to skip field
 | 
			
		||||
		if tag == "-" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		f := v.Field(i)
 | 
			
		||||
 | 
			
		||||
		if !isEmptyValue(f) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const literalQuote = '\''
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) encodeString(b []byte, v string, options valueOptions) []byte {
 | 
			
		||||
| 
						 | 
				
			
			@ -398,7 +453,6 @@ func (enc *Encoder) encodeLiteralString(b []byte, v string) []byte {
 | 
			
		|||
	return b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//nolint:cyclop
 | 
			
		||||
func (enc *Encoder) encodeQuotedString(multiline bool, b []byte, v string) []byte {
 | 
			
		||||
	stringQuote := `"`
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -652,10 +706,19 @@ func (enc *Encoder) encodeStruct(b []byte, ctx encoderCtx, v reflect.Value) ([]b
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (enc *Encoder) encodeComment(indent int, comment string, b []byte) []byte {
 | 
			
		||||
	if comment != "" {
 | 
			
		||||
	for len(comment) > 0 {
 | 
			
		||||
		var line string
 | 
			
		||||
		idx := strings.IndexByte(comment, '\n')
 | 
			
		||||
		if idx >= 0 {
 | 
			
		||||
			line = comment[:idx]
 | 
			
		||||
			comment = comment[idx+1:]
 | 
			
		||||
		} else {
 | 
			
		||||
			line = comment
 | 
			
		||||
			comment = ""
 | 
			
		||||
		}
 | 
			
		||||
		b = enc.indent(indent, b)
 | 
			
		||||
		b = append(b, "# "...)
 | 
			
		||||
		b = append(b, comment...)
 | 
			
		||||
		b = append(b, line...)
 | 
			
		||||
		b = append(b, '\n')
 | 
			
		||||
	}
 | 
			
		||||
	return b
 | 
			
		||||
| 
						 | 
				
			
			@ -736,7 +799,13 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro
 | 
			
		|||
	}
 | 
			
		||||
	ctx.skipTableHeader = false
 | 
			
		||||
 | 
			
		||||
	hasNonEmptyKV := false
 | 
			
		||||
	for _, kv := range t.kvs {
 | 
			
		||||
		if shouldOmitEmpty(kv.Options, kv.Value) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		hasNonEmptyKV = true
 | 
			
		||||
 | 
			
		||||
		ctx.setKey(kv.Key)
 | 
			
		||||
 | 
			
		||||
		b, err = enc.encodeKv(b, ctx, kv.Options, kv.Value)
 | 
			
		||||
| 
						 | 
				
			
			@ -747,7 +816,20 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro
 | 
			
		|||
		b = append(b, '\n')
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	first := true
 | 
			
		||||
	for _, table := range t.tables {
 | 
			
		||||
		if shouldOmitEmpty(table.Options, table.Value) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if first {
 | 
			
		||||
			first = false
 | 
			
		||||
			if hasNonEmptyKV {
 | 
			
		||||
				b = append(b, '\n')
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			b = append(b, "\n"...)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.setKey(table.Key)
 | 
			
		||||
 | 
			
		||||
		ctx.options = table.Options
 | 
			
		||||
| 
						 | 
				
			
			@ -756,8 +838,6 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro
 | 
			
		|||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		b = append(b, '\n')
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return b, nil
 | 
			
		||||
| 
						 | 
				
			
			@ -770,6 +850,10 @@ func (enc *Encoder) encodeTableInline(b []byte, ctx encoderCtx, t table) ([]byte
 | 
			
		|||
 | 
			
		||||
	first := true
 | 
			
		||||
	for _, kv := range t.kvs {
 | 
			
		||||
		if shouldOmitEmpty(kv.Options, kv.Value) {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if first {
 | 
			
		||||
			first = false
 | 
			
		||||
		} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -785,7 +869,7 @@ func (enc *Encoder) encodeTableInline(b []byte, ctx encoderCtx, t table) ([]byte
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if len(t.tables) > 0 {
 | 
			
		||||
		panic("inline table cannot contain nested tables, online key-values")
 | 
			
		||||
		panic("inline table cannot contain nested tables, only key-values")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	b = append(b, "}"...)
 | 
			
		||||
| 
						 | 
				
			
			@ -881,7 +965,13 @@ func (enc *Encoder) encodeSliceAsArrayTable(b []byte, ctx encoderCtx, v reflect.
 | 
			
		|||
	scratch = append(scratch, "]]\n"...)
 | 
			
		||||
	ctx.skipTableHeader = true
 | 
			
		||||
 | 
			
		||||
	b = enc.encodeComment(ctx.indent, ctx.options.comment, b)
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < v.Len(); i++ {
 | 
			
		||||
		if i != 0 {
 | 
			
		||||
			b = append(b, "\n"...)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		b = append(b, scratch...)
 | 
			
		||||
 | 
			
		||||
		var err error
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										96
									
								
								vendor/github.com/pelletier/go-toml/v2/unmarshaler.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										96
									
								
								vendor/github.com/pelletier/go-toml/v2/unmarshaler.go
									
										
									
										generated
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -79,22 +79,22 @@ func (d *Decoder) DisallowUnknownFields() *Decoder {
 | 
			
		|||
// strict mode and a field is missing, a `toml.StrictMissingError` is
 | 
			
		||||
// returned. In any other case, this function returns a standard Go error.
 | 
			
		||||
//
 | 
			
		||||
// Type mapping
 | 
			
		||||
// # Type mapping
 | 
			
		||||
//
 | 
			
		||||
// List of supported TOML types and their associated accepted Go types:
 | 
			
		||||
//
 | 
			
		||||
//   String           -> string
 | 
			
		||||
//   Integer          -> uint*, int*, depending on size
 | 
			
		||||
//   Float            -> float*, depending on size
 | 
			
		||||
//   Boolean          -> bool
 | 
			
		||||
//   Offset Date-Time -> time.Time
 | 
			
		||||
//   Local Date-time  -> LocalDateTime, time.Time
 | 
			
		||||
//   Local Date       -> LocalDate, time.Time
 | 
			
		||||
//   Local Time       -> LocalTime, time.Time
 | 
			
		||||
//   Array            -> slice and array, depending on elements types
 | 
			
		||||
//   Table            -> map and struct
 | 
			
		||||
//   Inline Table     -> same as Table
 | 
			
		||||
//   Array of Tables  -> same as Array and Table
 | 
			
		||||
//	String           -> string
 | 
			
		||||
//	Integer          -> uint*, int*, depending on size
 | 
			
		||||
//	Float            -> float*, depending on size
 | 
			
		||||
//	Boolean          -> bool
 | 
			
		||||
//	Offset Date-Time -> time.Time
 | 
			
		||||
//	Local Date-time  -> LocalDateTime, time.Time
 | 
			
		||||
//	Local Date       -> LocalDate, time.Time
 | 
			
		||||
//	Local Time       -> LocalTime, time.Time
 | 
			
		||||
//	Array            -> slice and array, depending on elements types
 | 
			
		||||
//	Table            -> map and struct
 | 
			
		||||
//	Inline Table     -> same as Table
 | 
			
		||||
//	Array of Tables  -> same as Array and Table
 | 
			
		||||
func (d *Decoder) Decode(v interface{}) error {
 | 
			
		||||
	b, err := ioutil.ReadAll(d.r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ type decoder struct {
 | 
			
		|||
	stashedExpr bool
 | 
			
		||||
 | 
			
		||||
	// Skip expressions until a table is found. This is set to true when a
 | 
			
		||||
	// table could not be create (missing field in map), so all KV expressions
 | 
			
		||||
	// table could not be created (missing field in map), so all KV expressions
 | 
			
		||||
	// need to be skipped.
 | 
			
		||||
	skipUntilTable bool
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -344,9 +344,9 @@ func (d *decoder) handleArrayTableCollectionLast(key ast.Iterator, v reflect.Val
 | 
			
		|||
		elem := v.Index(idx)
 | 
			
		||||
		_, err := d.handleArrayTable(key, elem)
 | 
			
		||||
		return v, err
 | 
			
		||||
	default:
 | 
			
		||||
		return reflect.Value{}, fmt.Errorf("toml: cannot decode array table into a %s", v.Type())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return d.handleArrayTable(key, v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// When parsing an array table expression, each part of the key needs to be
 | 
			
		||||
| 
						 | 
				
			
			@ -483,7 +483,7 @@ func (d *decoder) handleKeyPart(key ast.Iterator, v reflect.Value, nextFn handle
 | 
			
		|||
		d.errorContext.Struct = t
 | 
			
		||||
		d.errorContext.Field = path
 | 
			
		||||
 | 
			
		||||
		f := v.FieldByIndex(path)
 | 
			
		||||
		f := fieldByIndex(v, path)
 | 
			
		||||
		x, err := nextFn(key, f)
 | 
			
		||||
		if err != nil || d.skipUntilTable {
 | 
			
		||||
			return reflect.Value{}, err
 | 
			
		||||
| 
						 | 
				
			
			@ -866,12 +866,27 @@ func (d *decoder) unmarshalFloat(value *ast.Node, v reflect.Value) error {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) unmarshalInteger(value *ast.Node, v reflect.Value) error {
 | 
			
		||||
	const (
 | 
			
		||||
		maxInt = int64(^uint(0) >> 1)
 | 
			
		||||
		minInt = -maxInt - 1
 | 
			
		||||
	)
 | 
			
		||||
const (
 | 
			
		||||
	maxInt = int64(^uint(0) >> 1)
 | 
			
		||||
	minInt = -maxInt - 1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Maximum value of uint for decoding. Currently the decoder parses the integer
 | 
			
		||||
// into an int64. As a result, on architectures where uint is 64 bits, the
 | 
			
		||||
// effective maximum uint we can decode is the maximum of int64. On
 | 
			
		||||
// architectures where uint is 32 bits, the maximum value we can decode is
 | 
			
		||||
// lower: the maximum of uint32. I didn't find a way to figure out this value at
 | 
			
		||||
// compile time, so it is computed during initialization.
 | 
			
		||||
var maxUint int64 = math.MaxInt64
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	m := uint64(^uint(0))
 | 
			
		||||
	if m < uint64(maxUint) {
 | 
			
		||||
		maxUint = int64(m)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (d *decoder) unmarshalInteger(value *ast.Node, v reflect.Value) error {
 | 
			
		||||
	i, err := parseInteger(value.Data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			@ -932,7 +947,7 @@ func (d *decoder) unmarshalInteger(value *ast.Node, v reflect.Value) error {
 | 
			
		|||
 | 
			
		||||
		r = reflect.ValueOf(uint8(i))
 | 
			
		||||
	case reflect.Uint:
 | 
			
		||||
		if i < 0 {
 | 
			
		||||
		if i < 0 || i > maxUint {
 | 
			
		||||
			return fmt.Errorf("toml: negative number %d does not fit in an uint", i)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1056,7 +1071,7 @@ func (d *decoder) handleKeyValuePart(key ast.Iterator, value *ast.Node, v reflec
 | 
			
		|||
		d.errorContext.Struct = t
 | 
			
		||||
		d.errorContext.Field = path
 | 
			
		||||
 | 
			
		||||
		f := v.FieldByIndex(path)
 | 
			
		||||
		f := fieldByIndex(v, path)
 | 
			
		||||
		x, err := d.handleKeyValueInner(key, value, f)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return reflect.Value{}, err
 | 
			
		||||
| 
						 | 
				
			
			@ -1120,6 +1135,21 @@ func initAndDereferencePointer(v reflect.Value) reflect.Value {
 | 
			
		|||
	return elem
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Same as reflect.Value.FieldByIndex, but creates pointers if needed.
 | 
			
		||||
func fieldByIndex(v reflect.Value, path []int) reflect.Value {
 | 
			
		||||
	for i, x := range path {
 | 
			
		||||
		v = v.Field(x)
 | 
			
		||||
 | 
			
		||||
		if i < len(path)-1 && v.Kind() == reflect.Ptr {
 | 
			
		||||
			if v.IsNil() {
 | 
			
		||||
				v.Set(reflect.New(v.Type().Elem()))
 | 
			
		||||
			}
 | 
			
		||||
			v = v.Elem()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type fieldPathsMap = map[string][]int
 | 
			
		||||
 | 
			
		||||
var globalFieldPathsCache atomic.Value // map[danger.TypeID]fieldPathsMap
 | 
			
		||||
| 
						 | 
				
			
			@ -1167,11 +1197,6 @@ func forEachField(t reflect.Type, path []int, do func(name string, path []int))
 | 
			
		|||
		fieldPath := append(path, i)
 | 
			
		||||
		fieldPath = fieldPath[:len(fieldPath):len(fieldPath)]
 | 
			
		||||
 | 
			
		||||
		if f.Anonymous {
 | 
			
		||||
			forEachField(f.Type, fieldPath, do)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		name := f.Tag.Get("toml")
 | 
			
		||||
		if name == "-" {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -1180,6 +1205,19 @@ func forEachField(t reflect.Type, path []int, do func(name string, path []int))
 | 
			
		|||
		if i := strings.IndexByte(name, ','); i >= 0 {
 | 
			
		||||
			name = name[:i]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if f.Anonymous && name == "" {
 | 
			
		||||
			t2 := f.Type
 | 
			
		||||
			if t2.Kind() == reflect.Ptr {
 | 
			
		||||
				t2 = t2.Elem()
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if t2.Kind() == reflect.Struct {
 | 
			
		||||
				forEachField(t2, fieldPath, do)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if name == "" {
 | 
			
		||||
			name = f.Name
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue