52 lines
1.8 KiB
Go
52 lines
1.8 KiB
Go
|
package errorsx
|
||
|
|
||
|
// ErrWrapper is our error wrapper for Go errors. The key objective of
|
||
|
// this structure is to properly set Failure, which is also returned by
|
||
|
// the Error() method, so be one of the OONI defined strings.
|
||
|
type ErrWrapper struct {
|
||
|
// Failure is the OONI failure string. The failure strings are
|
||
|
// loosely backward compatible with Measurement Kit.
|
||
|
//
|
||
|
// This is either one of the FailureXXX strings or any other
|
||
|
// string like `unknown_failure ...`. The latter represents an
|
||
|
// error that we have not yet mapped to a failure.
|
||
|
Failure string
|
||
|
|
||
|
// Operation is the operation that failed. If possible, it
|
||
|
// SHOULD be a _major_ operation. Major operations are:
|
||
|
//
|
||
|
// - ResolveOperation: resolving a domain name failed
|
||
|
// - ConnectOperation: connecting to an IP failed
|
||
|
// - TLSHandshakeOperation: TLS handshaking failed
|
||
|
// - HTTPRoundTripOperation: other errors during round trip
|
||
|
//
|
||
|
// Because a network connection doesn't necessarily know
|
||
|
// what is the current major operation we also have the
|
||
|
// following _minor_ operations:
|
||
|
//
|
||
|
// - CloseOperation: CLOSE failed
|
||
|
// - ReadOperation: READ failed
|
||
|
// - WriteOperation: WRITE failed
|
||
|
//
|
||
|
// If an ErrWrapper referring to a major operation is wrapping
|
||
|
// another ErrWrapper and such ErrWrapper already refers to
|
||
|
// a major operation, then the new ErrWrapper should use the
|
||
|
// child ErrWrapper major operation. Otherwise, it should use
|
||
|
// its own major operation. This way, the topmost wrapper is
|
||
|
// supposed to refer to the major operation that failed.
|
||
|
Operation string
|
||
|
|
||
|
// WrappedErr is the error that we're wrapping.
|
||
|
WrappedErr error
|
||
|
}
|
||
|
|
||
|
// Error returns a description of the error that occurred.
|
||
|
func (e *ErrWrapper) Error() string {
|
||
|
return e.Failure
|
||
|
}
|
||
|
|
||
|
// Unwrap allows to access the underlying error
|
||
|
func (e *ErrWrapper) Unwrap() error {
|
||
|
return e.WrappedErr
|
||
|
}
|