package generic import ( "context" ) type hTransactionKey struct{} type HandlerTransaction struct { context.Context parent context.Context done chan struct{} result bool } func (h *HandlerTransaction) shouldContinue() bool { select { case <-h.parent.Done(): return false case <-h.done: return h.result } } func (h *HandlerTransaction) Commit() { h.result = true close(h.done) } func (h *HandlerTransaction) Rollback() { close(h.done) } func NewHandlerTransaction(ctx context.Context) *HandlerTransaction { ht := &HandlerTransaction{ parent: ctx, done: make(chan struct{}), } ctx = context.WithValue(ctx, hTransactionKey{}, ht) ht.Context = ctx return ht } func getHandlerTransaction(ctx context.Context) *HandlerTransaction { v, _ := ctx.Value(hTransactionKey{}).(*HandlerTransaction) return v }