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  }