1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
package cancelctx
import (
"context"
"time"
)
// customCancelContext wraps context and cancels as soon as channel closed.
type customCancelContext struct {
context.Context
ch <-chan struct{}
}
// Deadline not used.
func (c customCancelContext) Deadline() (time.Time, bool) { return time.Time{}, false }
// Done returns channel that will be closed as soon as connection closed.
func (c customCancelContext) Done() <-chan struct{} { return c.ch }
// Err returns context error.
func (c customCancelContext) Err() error {
select {
case <-c.ch:
return context.Canceled
default:
return nil
}
}
// New returns a wrapper context around original context that will
// be canceled on channel close.
func New(ctx context.Context, ch <-chan struct{}) context.Context {
return customCancelContext{Context: ctx, ch: ch}
}
|