golangci-lint: marshaler, strict (#523)
This commit is contained in:
+1
-1
@@ -27,7 +27,7 @@ enable = [
|
|||||||
"forcetypeassert",
|
"forcetypeassert",
|
||||||
"funlen",
|
"funlen",
|
||||||
"gci",
|
"gci",
|
||||||
"gochecknoglobals",
|
# "gochecknoglobals",
|
||||||
"gochecknoinits",
|
"gochecknoinits",
|
||||||
"gocognit",
|
"gocognit",
|
||||||
"goconst",
|
"goconst",
|
||||||
|
|||||||
+28
-19
@@ -49,19 +49,19 @@ func NewEncoder(w io.Writer) *Encoder {
|
|||||||
|
|
||||||
// SetTablesInline forces the encoder to emit all tables inline.
|
// SetTablesInline forces the encoder to emit all tables inline.
|
||||||
//
|
//
|
||||||
// This behavior can be controled on an individual struct field basis with the
|
// This behavior can be controlled on an individual struct field basis with the
|
||||||
// `inline="true"` tag.
|
// `inline="true"` tag.
|
||||||
func (e *Encoder) SetTablesInline(inline bool) {
|
func (enc *Encoder) SetTablesInline(inline bool) {
|
||||||
e.tablesInline = inline
|
enc.tablesInline = inline
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetArraysMultiline forces the encoder to emit all arrays with one element per
|
// SetArraysMultiline forces the encoder to emit all arrays with one element per
|
||||||
// line.
|
// line.
|
||||||
//
|
//
|
||||||
// This behavior can be controled on an individual struct field basis with the
|
// This behavior can be controlled on an individual struct field basis with the
|
||||||
// `multiline="true"` tag.
|
// `multiline="true"` tag.
|
||||||
func (e *Encoder) SetArraysMultiline(multiline bool) {
|
func (enc *Encoder) SetArraysMultiline(multiline bool) {
|
||||||
e.arraysMultiline = multiline
|
enc.arraysMultiline = multiline
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode writes a TOML representation of v to the stream.
|
// Encode writes a TOML representation of v to the stream.
|
||||||
@@ -165,18 +165,18 @@ func (ctx *encoderCtx) isRoot() bool {
|
|||||||
return len(ctx.parentKey) == 0 && !ctx.hasKey
|
return len(ctx.parentKey) == 0 && !ctx.hasKey
|
||||||
}
|
}
|
||||||
|
|
||||||
var errUnsupportedValue = errors.New("unsupported encode value kind")
|
var (
|
||||||
var errTextMarshalerCannotBeAtRoot = errors.New("type implementing TextMarshaler cannot be at root")
|
errUnsupportedValue = errors.New("unsupported encode value kind")
|
||||||
|
errTextMarshalerCannotBeAtRoot = errors.New("type implementing TextMarshaler cannot be at root")
|
||||||
|
)
|
||||||
|
|
||||||
//nolint:cyclop
|
//nolint:cyclop,funlen
|
||||||
func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, error) {
|
func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, error) {
|
||||||
//nolint:gocritic,godox
|
i, ok := v.Interface().(time.Time)
|
||||||
|
if ok {
|
||||||
if v.Type() == timeType {
|
return i.AppendFormat(b, time.RFC3339), nil
|
||||||
i := v.Interface().(time.Time)
|
|
||||||
b = i.AppendFormat(b, time.RFC3339)
|
|
||||||
return b, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if v.Type().Implements(textMarshalerType) {
|
if v.Type().Implements(textMarshalerType) {
|
||||||
if ctx.isRoot() {
|
if ctx.isRoot() {
|
||||||
return nil, errTextMarshalerCannotBeAtRoot
|
return nil, errTextMarshalerCannotBeAtRoot
|
||||||
@@ -184,9 +184,11 @@ func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, e
|
|||||||
|
|
||||||
text, err := v.Interface().(encoding.TextMarshaler).MarshalText()
|
text, err := v.Interface().(encoding.TextMarshaler).MarshalText()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, fmt.Errorf("encode: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
b = enc.encodeString(b, string(text), ctx.options)
|
b = enc.encodeString(b, string(text), ctx.options)
|
||||||
|
|
||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,6 +545,7 @@ func (enc *Encoder) encodeStruct(b []byte, ctx encoderCtx, v reflect.Value) ([]b
|
|||||||
|
|
||||||
func fieldBoolTag(field reflect.StructField, tag string) bool {
|
func fieldBoolTag(field reflect.StructField, tag string) bool {
|
||||||
x, ok := field.Tag.Lookup(tag)
|
x, ok := field.Tag.Lookup(tag)
|
||||||
|
|
||||||
return ok && x == "true"
|
return ok && x == "true"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,6 +581,7 @@ func (enc *Encoder) encodeTable(b []byte, ctx encoderCtx, t table) ([]byte, erro
|
|||||||
ctx.setKey(table.Key)
|
ctx.setKey(table.Key)
|
||||||
|
|
||||||
ctx.options = table.Options
|
ctx.options = table.Options
|
||||||
|
|
||||||
b, err = enc.encode(b, ctx, table.Value)
|
b, err = enc.encode(b, ctx, table.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -632,9 +636,10 @@ func (enc *Encoder) encodeTableInline(b []byte, ctx encoderCtx, t table) ([]byte
|
|||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var errNilInterface = errors.New("nil interface not supported")
|
var (
|
||||||
|
errNilInterface = errors.New("nil interface not supported")
|
||||||
var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem()
|
textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem()
|
||||||
|
)
|
||||||
|
|
||||||
func willConvertToTable(ctx encoderCtx, v reflect.Value) (bool, error) {
|
func willConvertToTable(ctx encoderCtx, v reflect.Value) (bool, error) {
|
||||||
if v.Type() == timeType || v.Type().Implements(textMarshalerType) {
|
if v.Type() == timeType || v.Type().Implements(textMarshalerType) {
|
||||||
@@ -765,7 +770,9 @@ func (enc *Encoder) encodeSliceAsArray(b []byte, ctx encoderCtx, v reflect.Value
|
|||||||
|
|
||||||
if multiline {
|
if multiline {
|
||||||
separator = ",\n"
|
separator = ",\n"
|
||||||
|
|
||||||
b = append(b, '\n')
|
b = append(b, '\n')
|
||||||
|
|
||||||
subCtx.indent++
|
subCtx.indent++
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,6 +800,7 @@ func (enc *Encoder) encodeSliceAsArray(b []byte, ctx encoderCtx, v reflect.Value
|
|||||||
b = append(b, '\n')
|
b = append(b, '\n')
|
||||||
b = enc.indent(ctx.indent, b)
|
b = enc.indent(ctx.indent, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
b = append(b, ']')
|
b = append(b, ']')
|
||||||
|
|
||||||
return b, nil
|
return b, nil
|
||||||
@@ -802,5 +810,6 @@ func (enc *Encoder) indent(level int, b []byte) []byte {
|
|||||||
for i := 0; i < level; i++ {
|
for i := 0; i < level; i++ {
|
||||||
b = append(b, enc.indentSymbol...)
|
b = append(b, enc.indentSymbol...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ A = [
|
|||||||
b, err := toml.Marshal(e.v)
|
b, err := toml.Marshal(e.v)
|
||||||
if e.err {
|
if e.err {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,6 +321,8 @@ A = [
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
testWithAllFlags(t, func(t *testing.T, flags int) {
|
testWithAllFlags(t, func(t *testing.T, flags int) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
enc := toml.NewEncoder(&buf)
|
enc := toml.NewEncoder(&buf)
|
||||||
setFlags(enc, flags)
|
setFlags(enc, flags)
|
||||||
@@ -364,6 +367,7 @@ func testWithFlags(t *testing.T, flags int, setters flagsSetters, testfn func(t
|
|||||||
|
|
||||||
if len(setters) == 0 {
|
if len(setters) == 0 {
|
||||||
testfn(t, flags)
|
testfn(t, flags)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,9 +376,11 @@ func testWithFlags(t *testing.T, flags int, setters flagsSetters, testfn func(t
|
|||||||
for _, enabled := range []bool{false, true} {
|
for _, enabled := range []bool{false, true} {
|
||||||
name := fmt.Sprintf("%s=%t", s.name, enabled)
|
name := fmt.Sprintf("%s=%t", s.name, enabled)
|
||||||
newFlags := flags << 1
|
newFlags := flags << 1
|
||||||
|
|
||||||
if enabled {
|
if enabled {
|
||||||
newFlags++
|
newFlags++
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
testWithFlags(t, newFlags, setters[1:], testfn)
|
testWithFlags(t, newFlags, setters[1:], testfn)
|
||||||
})
|
})
|
||||||
@@ -409,6 +415,8 @@ c = 'd'
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestIssue424(t *testing.T) {
|
func TestIssue424(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
type Message1 struct {
|
type Message1 struct {
|
||||||
Text string
|
Text string
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ func (s *strict) EnterTable(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.key.UpdateTable(node)
|
s.key.UpdateTable(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@ func (s *strict) EnterArrayTable(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.key.UpdateArrayTable(node)
|
s.key.UpdateArrayTable(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,6 +34,7 @@ func (s *strict) EnterKeyValue(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.key.Push(node)
|
s.key.Push(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,6 +42,7 @@ func (s *strict) ExitKeyValue(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.key.Pop(node)
|
s.key.Pop(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +50,7 @@ func (s *strict) MissingTable(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.missing = append(s.missing, decodeError{
|
s.missing = append(s.missing, decodeError{
|
||||||
highlight: keyLocation(node),
|
highlight: keyLocation(node),
|
||||||
message: "missing table",
|
message: "missing table",
|
||||||
@@ -57,6 +62,7 @@ func (s *strict) MissingField(node ast.Node) {
|
|||||||
if !s.Enabled {
|
if !s.Enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
s.missing = append(s.missing, decodeError{
|
s.missing = append(s.missing, decodeError{
|
||||||
highlight: keyLocation(node),
|
highlight: keyLocation(node),
|
||||||
message: "missing field",
|
message: "missing field",
|
||||||
@@ -72,8 +78,11 @@ func (s *strict) Error(doc []byte) error {
|
|||||||
err := &StrictMissingError{
|
err := &StrictMissingError{
|
||||||
Errors: make([]DecodeError, 0, len(s.missing)),
|
Errors: make([]DecodeError, 0, len(s.missing)),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, derr := range s.missing {
|
for _, derr := range s.missing {
|
||||||
|
derr := derr
|
||||||
err.Errors = append(err.Errors, *wrapDecodeError(doc, &derr))
|
err.Errors = append(err.Errors, *wrapDecodeError(doc, &derr))
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user