Sha256: b2bb60a2d03b6748c65a2c0b4d08afe66c57f634768ffb97c65578208c2b992f

Contents?: true

Size: 1.22 KB

Versions: 1

Compression:

Stored size: 1.22 KB

Contents

require "dry/transaction/result_matcher"
require "dry/transaction/step"
require "dry/transaction/step_adapters"
require "dry/transaction/sequence"

module Dry
  module Transaction
    # @api private
    class DSL < BasicObject
      attr_reader :container
      attr_reader :step_adapters
      attr_reader :steps
      attr_reader :matcher

      def initialize(options, &block)
        @container = options.fetch(:container)
        @step_adapters = options.fetch(:step_adapters) { StepAdapters }
        @steps = []
        @matcher = options.fetch(:matcher) { ResultMatcher }

        instance_eval(&block)
      end

      def respond_to_missing?(method_name)
        step_adapters.key?(method_name)
      end

      def method_missing(method_name, *args)
        return super unless step_adapters.key?(method_name)

        step_adapter = step_adapters[method_name]
        step_name = args.first
        options = args.last.is_a?(::Hash) ? args.last : {}
        operation_name = options.delete(:with) || step_name
        operation = container[operation_name]

        steps << Step.new(step_adapter, step_name, operation_name, operation, options)
      end

      def call
        Sequence.new(steps, matcher)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-transaction-0.8.0 lib/dry/transaction/dsl.rb