go-transaction-manager
58 строк · 1.3 Кб
1package trm
2
3//go:generate mockgen -source=$GOFILE -destination=drivers/mock/$GOFILE -package=mock
4
5import (
6"context"
7"errors"
8
9"go.uber.org/multierr"
10)
11
12// Manager manages a transaction from Begin to Commit or Rollback.
13type Manager interface {
14// Do processes a transaction inside a closure.
15Do(context.Context, func(ctx context.Context) error) error
16// DoWithSettings processes a transaction inside a closure with custom trm.Settings.
17DoWithSettings(context.Context, Settings, func(ctx context.Context) error) error
18}
19
20// ErrSkip marks error to skip rollback for transaction because of inside error.
21var ErrSkip = errors.New("skippable")
22
23// Skippable marks error as ErrSkip.
24func Skippable(err error) error {
25if err == nil {
26return nil
27}
28
29return multierr.Append(err, ErrSkip)
30}
31
32// UnSkippable removes ErrSkip from error.
33func UnSkippable(err error) error {
34if err == nil || !IsSkippable(err) {
35return err
36}
37
38ee := multierr.Errors(err)
39res := make([]error, 0, len(ee))
40
41for _, e := range ee {
42//nolint:errorlint,goerr113
43if e != ErrSkip {
44res = append(res, e)
45}
46}
47
48return multierr.Combine(res...)
49}
50
51// IsSkippable checks that the error is ErrSkip.
52func IsSkippable(err error) bool {
53if err == nil {
54return false
55}
56
57return errors.Is(err, ErrSkip)
58}
59