diff --git a/test/test-govet.sh b/test/test-govet.sh index 4865d8fe..294ea108 100755 --- a/test/test-govet.sh +++ b/test/test-govet.sh @@ -50,6 +50,10 @@ function naked-error() { } function consistent-imports() { + if [ "$1" = './util/errwrap/errwrap.go' ]; then + return 0 + fi + if grep $'\t"github.com/pkg/errors"' "$1"; then # import as errwrap return 1 fi diff --git a/util/errwrap/errwrap.go b/util/errwrap/errwrap.go new file mode 100644 index 00000000..a09ac6c7 --- /dev/null +++ b/util/errwrap/errwrap.go @@ -0,0 +1,46 @@ +// Mgmt +// Copyright (C) 2013-2018+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// Package errwrap contains some error helpers. +package errwrap + +import ( + "github.com/hashicorp/go-multierror" + "github.com/pkg/errors" +) + +// Wrapf adds a new error onto an existing chain of errors. If the new error to +// be added is nil, then the old error is returned unchanged. +func Wrapf(err error, format string, args ...interface{}) error { + return errors.Wrapf(err, format, args...) +} + +// Append can be used to safely append an error onto an existing one. If you +// pass in a nil error to append, the existing error will be returned unchanged. +// If the existing error is already nil, then the new error will be returned +// unchanged. This makes it easy to use Append as a safe `reterr += err`, when +// you don't know if either is nil or not. +func Append(reterr, err error) error { + if reterr == nil { // keep it simple, pass it through + return err // which might even be nil + } + if err == nil { // no error, so don't do anything + return reterr + } + // both are real errors + return multierror.Append(reterr, err) +} diff --git a/util/errwrap/errwrap_test.go b/util/errwrap/errwrap_test.go new file mode 100644 index 00000000..682ee4c6 --- /dev/null +++ b/util/errwrap/errwrap_test.go @@ -0,0 +1,51 @@ +// Mgmt +// Copyright (C) 2013-2018+ James Shubin and the project contributors +// Written by James Shubin and the project contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// +build !root + +package errwrap + +import ( + "fmt" + "testing" +) + +func TestWrapfErr1(t *testing.T) { + if err := Wrapf(nil, "whatever: %d", 42); err != nil { + t.Errorf("expected nil result") + } +} + +func TestAppendErr1(t *testing.T) { + if err := Append(nil, nil); err != nil { + t.Errorf("expected nil result") + } +} + +func TestAppendErr2(t *testing.T) { + reterr := fmt.Errorf("reterr") + if err := Append(reterr, nil); err != reterr { + t.Errorf("expected reterr") + } +} + +func TestAppendErr3(t *testing.T) { + err := fmt.Errorf("err") + if reterr := Append(nil, err); reterr != err { + t.Errorf("expected err") + } +}