mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 09:02:25 -05: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