github.com/storacha/go-ucanto@v0.7.2/server/transaction/transaction.go (about) 1 package transaction 2 3 import ( 4 "github.com/storacha/go-ucanto/core/receipt/fx" 5 "github.com/storacha/go-ucanto/core/result" 6 ) 7 8 // Transaction defines a result & effect pair, used by provider that wishes to 9 // return results that have effects. 10 type Transaction[O any, X any] interface { 11 Out() result.Result[O, X] 12 Fx() fx.Effects 13 } 14 15 type transaction[O, X any] struct { 16 out result.Result[O, X] 17 fx fx.Effects 18 } 19 20 func (t transaction[O, X]) Out() result.Result[O, X] { 21 return t.out 22 } 23 24 func (t transaction[O, X]) Fx() fx.Effects { 25 return t.fx 26 } 27 28 // Option is an option configuring a transaction. 29 type Option func(cfg *txConfig) 30 31 type txConfig struct { 32 fx fx.Effects 33 } 34 35 // WithEffects configures the effects for the receipt. 36 func WithEffects(fx fx.Effects) Option { 37 return func(cfg *txConfig) { 38 cfg.fx = fx 39 } 40 } 41 42 func NewTransaction[O, X any](result result.Result[O, X], options ...Option) Transaction[O, X] { 43 cfg := txConfig{} 44 for _, opt := range options { 45 opt(&cfg) 46 } 47 return transaction[O, X]{out: result, fx: cfg.fx} 48 }