go-transaction-manager
73 строки · 1.4 Кб
1package sql2
3import (4"database/sql"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) error11
12// WithTxOptions sets up sql.TxOptions for the Settings.
13func WithTxOptions(opts *sql.TxOptions) Opt {14return func(s *Settings) error {15*s = s.setTrOpts(opts)16
17return nil18}19}
20
21// Settings contains settings for sql.Transaction.
22type Settings struct {23trm.Settings24txOpts *sql.TxOptions25}
26
27// NewSettings creates Settings.
28func NewSettings(trms trm.Settings, oo ...Opt) (Settings, error) {29s := &Settings{Settings: trms, txOpts: nil}30
31for _, o := range oo {32if err := o(s); err != nil {33return Settings{}, err34}35}36
37return *s, nil38}
39
40// MustSettings returns Settings if err is nil and panics otherwise.
41func MustSettings(trms trm.Settings, oo ...Opt) Settings {42s, err := NewSettings(trms, oo...)43if err != nil {44panic(err)45}46
47return s48}
49
50// EnrichBy fills nil properties from external Settings.
51func (s Settings) EnrichBy(in trm.Settings) trm.Settings {52external, ok := in.(Settings)53if ok {54if s.TxOpts() == nil {55s = s.setTrOpts(external.TxOpts())56}57}58
59s.Settings = s.Settings.EnrichBy(in)60
61return s62}
63
64// TxOpts returns trm.CtxKey for the trm.Transaction.
65func (s Settings) TxOpts() *sql.TxOptions {66return s.txOpts67}
68
69func (s Settings) setTrOpts(opts *sql.TxOptions) Settings {70s.txOpts = opts71
72return s73}
74