diff --git a/internal/lib/fmt/errors.go b/internal/lib/fmt/errors.go new file mode 100644 index 00000000..1fbd39f8 --- /dev/null +++ b/internal/lib/fmt/errors.go @@ -0,0 +1,78 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package fmt + +import ( + "errors" + "sort" +) + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// If the format specifier includes a %w verb with an error operand, +// the returned error will implement an Unwrap method returning the operand. +// If there is more than one %w verb, the returned error will implement an +// Unwrap method returning a []error containing all the %w operands in the +// order they appear in the arguments. +// It is invalid to supply the %w verb with an operand that does not implement +// the error interface. The %w verb is otherwise a synonym for %v. +func Errorf(format string, a ...any) error { + p := newPrinter() + p.wrapErrs = true + p.doPrintf(format, a) + s := string(p.buf) + var err error + switch len(p.wrappedErrs) { + case 0: + err = errors.New(s) + case 1: + w := &wrapError{msg: s} + w.err, _ = a[p.wrappedErrs[0]].(error) + err = w + default: + if p.reordered { + sort.Ints(p.wrappedErrs) + } + var errs []error + for i, argNum := range p.wrappedErrs { + if i > 0 && p.wrappedErrs[i-1] == argNum { + continue + } + if e, ok := a[argNum].(error); ok { + errs = append(errs, e) + } + } + err = &wrapErrors{s, errs} + } + p.free() + return err +} + +type wrapError struct { + msg string + err error +} + +func (e *wrapError) Error() string { + return e.msg +} + +func (e *wrapError) Unwrap() error { + return e.err +} + +type wrapErrors struct { + msg string + errs []error +} + +func (e *wrapErrors) Error() string { + return e.msg +} + +func (e *wrapErrors) Unwrap() []error { + return e.errs +} diff --git a/internal/lib/time/format.go b/internal/lib/time/format.go index 0e40c9c7..2d42dd96 100644 --- a/internal/lib/time/format.go +++ b/internal/lib/time/format.go @@ -1582,7 +1582,6 @@ func leadingFraction(s string) (x uint64, scale float64, rem string) { return x, scale, s[i:] } -/* TODO(xsw): var unitMap = map[string]uint64{ "ns": uint64(Nanosecond), "us": uint64(Microsecond), @@ -1697,4 +1696,3 @@ func ParseDuration(s string) (Duration, error) { } return Duration(d), nil } -*/