Skip to content

Commit 1cb201a

Browse files
committed
GODRIVER-2774 Refactor replaceErrors to use errors.Is/errors.As
1 parent ff50112 commit 1cb201a

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

internal/codecutil/encoding.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ func (e MarshalError) Error() string {
3232
reflect.TypeOf(e.Value), e.Err)
3333
}
3434

35+
func (e MarshalError) Unwrap() error { return e.Err }
36+
3537
// EncoderFn is used to functionally construct an encoder for marshaling values.
3638
type EncoderFn func(io.Writer) *bson.Encoder
3739

mongo/errors.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,35 @@ func replaceErrors(err error) error {
7575
// ignored. For non-DDL write commands (insert, update, etc), acknowledgement
7676
// should be be propagated at the result-level: e.g.,
7777
// SingleResult.Acknowledged.
78-
if errors.Is(err, driver.ErrUnacknowledgedWrite) {
78+
// if errors.Is(err, driver.ErrUnacknowledgedWrite) {
79+
// return nil
80+
// }
81+
if err == driver.ErrUnacknowledgedWrite {
7982
return nil
8083
}
8184

8285
if errors.Is(err, topology.ErrTopologyClosed) {
8386
return ErrClientDisconnected
8487
}
85-
if de, ok := err.(driver.Error); ok {
88+
89+
var de driver.Error
90+
if errors.As(err, &de) {
8691
return CommandError{
8792
Code: de.Code,
8893
Message: de.Message,
8994
Labels: de.Labels,
9095
Name: de.Name,
91-
Wrapped: de.Wrapped,
96+
Wrapped: err,
9297
Raw: bson.Raw(de.Raw),
9398
}
9499
}
95-
if qe, ok := err.(driver.QueryFailureError); ok {
100+
101+
var qe driver.QueryFailureError
102+
if errors.As(err, &qe) {
96103
// qe.Message is "command failure"
97104
ce := CommandError{
98105
Name: qe.Message,
99-
Wrapped: qe.Wrapped,
106+
Wrapped: err,
100107
Raw: bson.Raw(qe.Response),
101108
}
102109

@@ -111,18 +118,25 @@ func replaceErrors(err error) error {
111118

112119
return ce
113120
}
114-
if me, ok := err.(mongocrypt.Error); ok {
115-
return MongocryptError{Code: me.Code, Message: me.Message}
121+
122+
var me mongocrypt.Error
123+
if errors.As(err, &me) {
124+
return MongocryptError{
125+
Code: me.Code,
126+
Message: me.Message,
127+
wrapped: err,
128+
}
116129
}
117130

118131
if errors.Is(err, codecutil.ErrNilValue) {
119132
return ErrNilValue
120133
}
121134

122-
if marshalErr, ok := err.(codecutil.MarshalError); ok {
135+
var marshalErr codecutil.MarshalError
136+
if errors.As(err, &marshalErr) {
123137
return MarshalError{
124138
Value: marshalErr.Value,
125-
Err: marshalErr.Err,
139+
Err: err,
126140
}
127141
}
128142

@@ -199,13 +213,19 @@ func IsNetworkError(err error) bool {
199213
type MongocryptError struct {
200214
Code int32
201215
Message string
216+
wrapped error
202217
}
203218

204219
// Error implements the error interface.
205220
func (m MongocryptError) Error() string {
206221
return fmt.Sprintf("mongocrypt error %d: %v", m.Code, m.Message)
207222
}
208223

224+
// Unwrap returns the underlying error.
225+
func (m MongocryptError) Unwrap() error {
226+
return m.wrapped
227+
}
228+
209229
// EncryptionKeyVaultError represents an error while communicating with the key vault collection during in-use
210230
// encryption.
211231
type EncryptionKeyVaultError struct {

mongo/mongo.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ func (me MarshalError) Error() string {
4343
return fmt.Sprintf("cannot marshal type %s to a BSON Document: %v", reflect.TypeOf(me.Value), me.Err)
4444
}
4545

46+
func (me MarshalError) Unwrap() error { return me.Err }
47+
4648
// Pipeline is a type that makes creating aggregation pipelines easier. It is a
4749
// helper and is intended for serializing to BSON.
4850
//

0 commit comments

Comments
 (0)