Sha256: e68945de140adc342457035bace8422dea7aaba17e6a2b203c72343e90de0447

Contents?: true

Size: 1.41 KB

Versions: 2

Compression:

Stored size: 1.41 KB

Contents

# frozen_string_literal: true

module Opera
  module Operation
    module Builder
      INSTRUCTIONS = %I[validate transaction benchmark step success finish_if operation operations].freeze

      def self.included(base)
        base.extend(ClassMethods)
      end

      module ClassMethods
        def instructions
          @instructions ||= []
        end

        INSTRUCTIONS.each do |instruction|
          define_method instruction do |method = nil, &blk|
            self.check_method_availability!(method) if method
            instructions.concat(InnerBuilder.new.send(instruction, method, &blk))
          end
        end
      end

      class InnerBuilder
        attr_reader :instructions

        def initialize(&block)
          @instructions = []
          instance_eval(&block) if block_given?
        end

        INSTRUCTIONS.each do |instruction|
          define_method instruction do |method = nil, &blk|
            instructions << if !blk.nil?
                              {
                                kind: instruction,
                                instructions: InnerBuilder.new(&blk).instructions
                              }
                            else
                              {
                                kind: instruction,
                                method: method
                              }
                            end
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
opera-0.3.3 lib/opera/operation/builder.rb
opera-0.3.2 lib/opera/operation/builder.rb