Skip to content

Commit

Permalink
tools: display error context when it exists (#749)
Browse files Browse the repository at this point in the history
For example when failing to decode toml, display the context around the
error and the location of the problem.
  • Loading branch information
pelletier committed Apr 8, 2022
1 parent 9804fc5 commit 88a8aec
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
14 changes: 13 additions & 1 deletion internal/cli/cli.go
Expand Up @@ -2,11 +2,14 @@ package cli

import (
"bytes"
"errors"
"flag"
"fmt"
"io"
"io/ioutil"
"os"

"github.com/pelletier/go-toml/v2"
)

type ConvertFn func(r io.Reader, w io.Writer) error
Expand All @@ -28,7 +31,16 @@ func (p *Program) Execute() {
func (p *Program) main(files []string, input io.Reader, output, error io.Writer) int {
err := p.run(files, input, output)
if err != nil {
fmt.Fprintln(error, err.Error())

var derr *toml.DecodeError
if errors.As(err, &derr) {
fmt.Fprintln(error, derr.String())
row, col := derr.Position()
fmt.Fprintln(error, "error occurred at row", row, "column", col)
} else {
fmt.Fprintln(error, err.Error())
}

return -1
}
return 0
Expand Down
16 changes: 16 additions & 0 deletions internal/cli/cli_test.go
Expand Up @@ -10,6 +10,7 @@ import (
"strings"
"testing"

"github.com/pelletier/go-toml/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -47,6 +48,21 @@ func TestProcessMainStdinErr(t *testing.T) {
assert.NotEmpty(t, stderr.String())
}

func TestProcessMainStdinDecodeErr(t *testing.T) {
stdout := new(bytes.Buffer)
stderr := new(bytes.Buffer)
input := strings.NewReader("this is the input")

exit := processMain([]string{}, input, stdout, stderr, func(r io.Reader, w io.Writer) error {
var v interface{}
return toml.Unmarshal([]byte(`qwe = 001`), &v)
})

assert.Equal(t, -1, exit)
assert.Empty(t, stdout.String())
assert.Contains(t, stderr.String(), "error occurred at")
}

func TestProcessMainFileExists(t *testing.T) {
tmpfile, err := ioutil.TempFile("", "example")
require.NoError(t, err)
Expand Down

0 comments on commit 88a8aec

Please sign in to comment.