Skip to content

Commit 32bd51d

Browse files
authored
fix: add (*statz.statusError).Format() for stacktrace (#97)
2 parents 987b181 + 0cf36c4 commit 32bd51d

File tree

4 files changed

+47
-17
lines changed

4 files changed

+47
-17
lines changed

.bin/git-tag-mod.sh

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,16 @@ __main__() {
4444
LogshInfo "$(printf "targets: %s" "${targets:-none}")"
4545
if [ -n "${targets:-}" ]; then
4646
while read -r mod; do
47-
mod_tag="${mod:?}/${latest_git_tag:?}"
48-
if git tag --sort=v:refname | grep -qE "^${mod_tag:?}$"; then
49-
LogshInfo "$(printf "tag already exists: %s" "${mod_tag:?}")"
47+
go_module_tag="${mod:?}/${latest_git_tag:?}"
48+
if git tag --sort=v:refname | grep -qE "^${go_module_tag:?}$"; then
49+
# skip
50+
LogshInfo "$(printf "tag already exists: %s" "${go_module_tag:?}")"
5051
continue
5152
fi
52-
git tag -a "${mod_tag:?}" -m "${mod_tag:?}" "${latest_git_tag_commit:?}"
53+
# add tag
54+
LogshExec git tag -a "${go_module_tag:?}" -m "${go_module_tag:?}" "${latest_git_tag_commit:?}"
5355
done <<<"${targets:?}"
56+
5457
git push --tags
5558
fi
5659
}

errors/fmt.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ loop:
176176
e.Format(s, verb)
177177
break loop
178178
default:
179-
fmt.Fprint(s, e)
179+
fmt.Fprintf(s, fmt.FormatString(s, verb), e)
180180
break loop
181181
}
182182
if err == nil {

grpc/status/status.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const (
2323

2424
type statusError struct {
2525
error
26-
*status.Status
26+
s *status.Status
2727
level Level
2828
logger Logger
2929
}
@@ -44,14 +44,14 @@ func WithLogger(handler Logger) ErrorOption { //nolint:ireturn
4444
}
4545

4646
func (o *newOptionDetails) apply(e *statusError) {
47-
statusWithDetails, err := e.WithDetails(o.details...)
47+
statusWithDetails, err := e.s.WithDetails(o.details...)
4848
if err != nil {
49-
err = errorz.NewErrorf(errorz.WithCallerSkip(2))("e.WithDetails: details=%v: %w", o.details, err)
49+
err = errorz.NewErrorf(errorz.WithCallerSkip(2))("e.s.WithDetails: details=%v: %w", o.details, err)
5050
e.logger(context.Background(), ErrorLevel, status.New(codes.Unknown, "WithDetails failed"), err)
5151
return
5252
}
5353

54-
e.Status = statusWithDetails
54+
e.s = statusWithDetails
5555
}
5656

5757
func WithDetails(details ...protoiface.MessageV1) ErrorOption { //nolint:ireturn
@@ -64,19 +64,33 @@ var (
6464
DefaultLogger Logger = func(_ context.Context, level Level, stat *status.Status, err error) {
6565
log.Printf("level=%s code=%s message=%q details=%s error=%q stacktrace=%q", level, stat.Code(), stat.Message(), stat.Details(), fmt.Sprintf("%v", err), fmt.Sprintf("%+v", err))
6666
}
67-
errorf = errorz.NewErrorf(errorz.WithCallerSkip(1))
67+
_ interface{ GRPCStatus() *status.Status } = (*statusError)(nil)
68+
errorf = errorz.NewErrorf(errorz.WithCallerSkip(1))
6869
)
6970

7071
func New(ctx context.Context, level Level, code codes.Code, msg string, err error, opts ...ErrorOption) error {
7172
e := &statusError{
7273
error: errorf("errgrpc.New: level=%s code=%s message=%s: %w", level, code, msg, err),
73-
Status: status.New(code, msg),
74+
s: status.New(code, msg),
7475
level: level,
7576
logger: DefaultLogger,
7677
}
7778
for _, opt := range opts {
7879
opt.apply(e)
7980
}
80-
e.logger(ctx, e.level, e.Status, err)
81-
return errorf("%s: %s", msg, err)
81+
e.logger(ctx, e.level, e.s, err)
82+
return e
83+
}
84+
85+
func (e *statusError) Format(s fmt.State, verb rune) {
86+
if formatter, ok := e.error.(fmt.Formatter); ok { //nolint:errorlint
87+
formatter.Format(s, verb)
88+
return
89+
}
90+
91+
_, _ = fmt.Fprintf(s, fmt.FormatString(s, verb), e.error)
92+
}
93+
94+
func (e *statusError) GRPCStatus() *status.Status {
95+
return e.s
8296
}

grpc/status/status_test.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
package statz_test
1+
package statz
22

33
import (
44
"context"
5+
"errors"
56
"io"
67
"testing"
78

89
"google.golang.org/genproto/googleapis/rpc/errdetails"
910
"google.golang.org/grpc/codes"
11+
"google.golang.org/grpc/status"
1012

1113
errorz "github.com/kunitsucom/util.go/errors"
12-
statz "github.com/kunitsucom/util.go/grpc/status"
1314
)
1415

1516
func TestNew(t *testing.T) {
@@ -20,9 +21,21 @@ func TestNew(t *testing.T) {
2021

2122
ctx := context.Background()
2223
before := errorz.Errorf("err: %w", io.ErrUnexpectedEOF)
23-
err := statz.New(ctx, statz.ErrorLevel, codes.Internal, "my error message", before, statz.WithDetails(&errdetails.DebugInfo{StackEntries: []string{"stack1", "stack2"}}), statz.WithDetails(nil), statz.WithLogger(statz.DefaultLogger))
24+
err := New(ctx, ErrorLevel, codes.Internal, "my error message", before, WithDetails(&errdetails.DebugInfo{StackEntries: []string{"stack1", "stack2"}}), WithDetails(nil), WithLogger(DefaultLogger))
2425
t.Logf("🪲: [%%v]:\n%v", err)
2526
t.Logf("🪲: [%%+v]:\n%+v", err)
26-
_ = statz.New(ctx, statz.ErrorLevel, codes.Internal, "my error message", before, statz.WithLogger(statz.DiscardLogger))
27+
28+
var e *statusError
29+
if !errors.As(err, &e) {
30+
t.Errorf("❌: something wrong")
31+
}
32+
e.error = io.ErrUnexpectedEOF
33+
t.Logf("🪲: [%%v]:\n%v", e)
34+
35+
s, ok := New(ctx, ErrorLevel, codes.Internal, "my error message", io.ErrUnexpectedEOF, WithLogger(DiscardLogger)).(interface{ GRPCStatus() *status.Status }) //nolint:errorlint
36+
if !ok {
37+
t.Errorf("❌: New: not implement interface{ GRPCStatus() *status.Status }")
38+
}
39+
t.Logf("🪲: [%%v]:\n%v", s.GRPCStatus())
2740
})
2841
}

0 commit comments

Comments
 (0)