Sha256: 4217a57aa68c2de7a70a8e2e666b3f7e02a5ee6b347cbce0d49d58cb4c6c761c

Contents?: true

Size: 925 Bytes

Versions: 2

Compression:

Stored size: 925 Bytes

Contents

require "wisper"
require "dry/transaction/step_failure"

module Dry
  module Transaction
    # @api private
    class Step
      include Wisper::Publisher

      attr_reader :step_name
      attr_reader :operation
      attr_reader :call_args

      def initialize(step_name, operation, call_args = [])
        @step_name = step_name
        @operation = operation
        @call_args = call_args
      end

      def with_call_args(*call_args)
        self.class.new(step_name, operation, call_args)
      end

      def call(input)
        args = call_args + [input]
        result = operation.call(*args)

        result.fmap { |value|
          broadcast :"#{step_name}_success", value
          value
        }.or { |value|
          broadcast :"#{step_name}_failure", *args, value
          Left(StepFailure.new(step_name, value))
        }
      end

      def arity
        operation.arity
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dry-transaction-0.5.0 lib/dry/transaction/step.rb
dry-transaction-0.4.0 lib/dry/transaction/step.rb