Module: Dry::Mutations::Transactions::DSL

Includes:
Dry::Monads::Either::Mixin
Defined in:
lib/dry/mutations/transactions/dsl.rb

Overview

dry-rb.org/gems/dry-transaction/basic-usage/ save_user = Dry.Transaction(container: Container) do

step :process
step :validate
step :persist

end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/dry/mutations/transactions/dsl.rb', line 13

def self.extended base
  fail Errors::TypeError.new("Extended class [#{base}] should not respond to :call, it is defined by this extension.") if base.respond_to?(:call)
  base.send :define_method, :initialize do |input|
    @input = input
  end unless base.instance_methods(false).include?(:initialize)
  %i(run run!).each do |meth|
    base.send :define_method, meth do
      base.public_send(meth, @input)
    end unless base.instance_methods(false).include?(meth)
  end
end

Instance Method Details

#chain(**params) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/dry/mutations/transactions/dsl.rb', line 25

def chain **params
  return enum_for(:chain) unless block_given? # FIXME: Needed? Works? Remove?

  λ = Proc.new

  @transaction = ::Dry.Transaction(container: ::Dry::Mutations::Transactions::Container, step_adapters: StepAdapters) do
    instance_eval(&λ)
  end.tap do |transaction|
    singleton_class.send :define_method, :call do |input|
      transaction.(input)
    end
    singleton_class.send :define_method, :run do |input|
      ::Dry::Mutations::Extensions::Outcome(transaction.(input))
    end
    singleton_class.send :define_method, :run! do |input|
      ::Dry::Mutations::Extensions::Outcome!(transaction.(input))
    end
  end
end