go-transaction-manager
102 строки · 2.2 Кб
1package mongo
2
3import (
4"go.mongodb.org/mongo-driver/mongo/options"
5
6trm "github.com/avito-tech/go-transaction-manager/trm/v2"
7)
8
9// Opt is a type to configure Settings.
10type Opt func(*Settings) error
11
12// WithSessionOpts sets up options.SessionOptions for the Settings.
13func WithSessionOpts(opts *options.SessionOptions) Opt {
14return func(s *Settings) error {
15*s = s.setSessionOpts(opts)
16
17return nil
18}
19}
20
21// WithTransactionOpts sets up options.TransactionOptions for the Settings.
22func WithTransactionOpts(opts *options.TransactionOptions) Opt {
23return func(s *Settings) error {
24*s = s.setTransactionOpts(opts)
25
26return nil
27}
28}
29
30// Settings contains settings for mongo.Transaction.
31type Settings struct {
32trm.Settings
33sessionOpts *options.SessionOptions
34transactionOpts *options.TransactionOptions
35}
36
37// NewSettings creates Settings.
38func NewSettings(trms trm.Settings, oo ...Opt) (Settings, error) {
39s := &Settings{
40Settings: trms,
41sessionOpts: nil,
42transactionOpts: nil,
43}
44
45for _, o := range oo {
46if err := o(s); err != nil {
47return Settings{}, err
48}
49}
50
51return *s, nil
52}
53
54// MustSettings returns Settings if err is nil and panics otherwise.
55func MustSettings(trms trm.Settings, oo ...Opt) Settings {
56s, err := NewSettings(trms, oo...)
57if err != nil {
58panic(err)
59}
60
61return s
62}
63
64// EnrichBy fills nil properties from external Settings.
65func (s Settings) EnrichBy(in trm.Settings) trm.Settings {
66external, ok := in.(Settings)
67if ok {
68if s.SessionOpts() == nil {
69s = s.setSessionOpts(external.SessionOpts())
70}
71
72if s.TransactionOpts() == nil {
73s = s.setTransactionOpts(external.TransactionOpts())
74}
75}
76
77s.Settings = s.Settings.EnrichBy(in)
78
79return s
80}
81
82// SessionOpts returns *options.SessionOptions for the trm.Transaction.
83func (s Settings) SessionOpts() *options.SessionOptions {
84return s.sessionOpts
85}
86
87func (s Settings) setSessionOpts(opts *options.SessionOptions) Settings {
88s.sessionOpts = opts
89
90return s
91}
92
93// TransactionOpts returns trm.CtxKey for the trm.Transaction.
94func (s Settings) TransactionOpts() *options.TransactionOptions {
95return s.transactionOpts
96}
97
98func (s Settings) setTransactionOpts(opts *options.TransactionOptions) Settings {
99s.transactionOpts = opts
100
101return s
102}
103