mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-15 11:13:37 +08:00

This commit... is a second attempt at: https://github.com/jbenet/go-ipfs/pull/68 partially addresses: https://github.com/jbenet/go-ipfs/issues/66 is the result of discussion at: https://gist.github.com/perfmode/f2951c1ed3a02c484d0b
36 lines
1.1 KiB
Go
36 lines
1.1 KiB
Go
package util
|
|
|
|
import (
|
|
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
|
|
)
|
|
|
|
// privateChanType protects the channel. Since this is a package-private type,
|
|
// only methods defined in this package can get the error value from the
|
|
// context.
|
|
type privateChanType chan error
|
|
|
|
const errLogKey = "the key used to extract the error log from the context"
|
|
|
|
// ContextWithErrorLog returns a copy of parent and an error channel that can
|
|
// be used to receive errors sent with the LogError method.
|
|
func ContextWithErrorLog(parent context.Context) (context.Context, <-chan error) {
|
|
errs := make(privateChanType)
|
|
ctx := context.WithValue(parent, errLogKey, errs)
|
|
return ctx, errs
|
|
}
|
|
|
|
// LogError logs the error to the owner of the context.
|
|
//
|
|
// If this context was created with ContextWithErrorLog, then this method
|
|
// passes the error to context creator over an unbuffered channel.
|
|
//
|
|
// If this context was created by other means, this method is a no-op.
|
|
func LogError(ctx context.Context, err error) {
|
|
v := ctx.Value(errLogKey)
|
|
errs, ok := v.(privateChanType)
|
|
if !ok {
|
|
return
|
|
}
|
|
errs <- err
|
|
}
|