go-transaction-manager

Форк
0
102 строки · 2.2 Кб
1
package mongo
2

3
import (
4
	"go.mongodb.org/mongo-driver/mongo/options"
5

6
	trm "github.com/avito-tech/go-transaction-manager/trm/v2"
7
)
8

9
// Opt is a type to configure Settings.
10
type Opt func(*Settings) error
11

12
// WithSessionOpts sets up options.SessionOptions for the Settings.
13
func WithSessionOpts(opts *options.SessionOptions) Opt {
14
	return func(s *Settings) error {
15
		*s = s.setSessionOpts(opts)
16

17
		return nil
18
	}
19
}
20

21
// WithTransactionOpts sets up options.TransactionOptions for the Settings.
22
func WithTransactionOpts(opts *options.TransactionOptions) Opt {
23
	return func(s *Settings) error {
24
		*s = s.setTransactionOpts(opts)
25

26
		return nil
27
	}
28
}
29

30
// Settings contains settings for mongo.Transaction.
31
type Settings struct {
32
	trm.Settings
33
	sessionOpts     *options.SessionOptions
34
	transactionOpts *options.TransactionOptions
35
}
36

37
// NewSettings creates Settings.
38
func NewSettings(trms trm.Settings, oo ...Opt) (Settings, error) {
39
	s := &Settings{
40
		Settings:        trms,
41
		sessionOpts:     nil,
42
		transactionOpts: nil,
43
	}
44

45
	for _, o := range oo {
46
		if err := o(s); err != nil {
47
			return Settings{}, err
48
		}
49
	}
50

51
	return *s, nil
52
}
53

54
// MustSettings returns Settings if err is nil and panics otherwise.
55
func MustSettings(trms trm.Settings, oo ...Opt) Settings {
56
	s, err := NewSettings(trms, oo...)
57
	if err != nil {
58
		panic(err)
59
	}
60

61
	return s
62
}
63

64
// EnrichBy fills nil properties from external Settings.
65
func (s Settings) EnrichBy(in trm.Settings) trm.Settings {
66
	external, ok := in.(Settings)
67
	if ok {
68
		if s.SessionOpts() == nil {
69
			s = s.setSessionOpts(external.SessionOpts())
70
		}
71

72
		if s.TransactionOpts() == nil {
73
			s = s.setTransactionOpts(external.TransactionOpts())
74
		}
75
	}
76

77
	s.Settings = s.Settings.EnrichBy(in)
78

79
	return s
80
}
81

82
// SessionOpts returns *options.SessionOptions for the trm.Transaction.
83
func (s Settings) SessionOpts() *options.SessionOptions {
84
	return s.sessionOpts
85
}
86

87
func (s Settings) setSessionOpts(opts *options.SessionOptions) Settings {
88
	s.sessionOpts = opts
89

90
	return s
91
}
92

93
// TransactionOpts returns trm.CtxKey for the trm.Transaction.
94
func (s Settings) TransactionOpts() *options.TransactionOptions {
95
	return s.transactionOpts
96
}
97

98
func (s Settings) setTransactionOpts(opts *options.TransactionOptions) Settings {
99
	s.transactionOpts = opts
100

101
	return s
102
}
103

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

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

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

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