go-transaction-manager

Форк
0
58 строк · 1.3 Кб
1
package trm
2

3
//go:generate mockgen -source=$GOFILE -destination=drivers/mock/$GOFILE -package=mock
4

5
import (
6
	"context"
7
	"errors"
8

9
	"go.uber.org/multierr"
10
)
11

12
// Manager manages a transaction from Begin to Commit or Rollback.
13
type Manager interface {
14
	// Do processes a transaction inside a closure.
15
	Do(context.Context, func(ctx context.Context) error) error
16
	// DoWithSettings processes a transaction inside a closure with custom trm.Settings.
17
	DoWithSettings(context.Context, Settings, func(ctx context.Context) error) error
18
}
19

20
// ErrSkip marks error to skip rollback for transaction because of inside error.
21
var ErrSkip = errors.New("skippable")
22

23
// Skippable marks error as ErrSkip.
24
func Skippable(err error) error {
25
	if err == nil {
26
		return nil
27
	}
28

29
	return multierr.Append(err, ErrSkip)
30
}
31

32
// UnSkippable removes ErrSkip from error.
33
func UnSkippable(err error) error {
34
	if err == nil || !IsSkippable(err) {
35
		return err
36
	}
37

38
	ee := multierr.Errors(err)
39
	res := make([]error, 0, len(ee))
40

41
	for _, e := range ee {
42
		//nolint:errorlint,goerr113
43
		if e != ErrSkip {
44
			res = append(res, e)
45
		}
46
	}
47

48
	return multierr.Combine(res...)
49
}
50

51
// IsSkippable checks that the error is ErrSkip.
52
func IsSkippable(err error) bool {
53
	if err == nil {
54
		return false
55
	}
56

57
	return errors.Is(err, ErrSkip)
58
}
59

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.