Sha256: d3e78d076e16ba5894d3ba6f44323d56e2afd87e979237f06a3a3a4202b85622

Contents?: true

Size: 1.13 KB

Versions: 4

Compression:

Stored size: 1.13 KB

Contents

# frozen_string_literal: true

module Pathway
  module Plugins
    module Responder
      module ClassMethods
        def call(ctx, *params, &bl)
          result = super(ctx, *params)
          block_given? ? Responder.respond(result, &bl) : result
        end
      end

      class Responder
        def self.respond(result, &bl)
          r = new(result, &bl)
          r.respond
        end

        def initialize(result, &bl)
          @result, @context, @fails = result, bl.binding.receiver, {}
          instance_eval(&bl)
        end

        def success(&bl)
          @ok = bl
        end

        def failure(type = nil, &bl)
          if type.nil?
            @fail_default = bl
          else
            @fails[type] = bl
          end
        end

        def respond
          if @result.success?
            @context.instance_exec(@result.value, &@ok)
          elsif Error === @result.error && fail_block = @fails[@result.error.type]
            @context.instance_exec(@result.error, &fail_block)
          else
            @context.instance_exec(@result.error, &@fail_default)
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
pathway-0.11.3 lib/pathway/plugins/responder.rb
pathway-0.11.2 lib/pathway/plugins/responder.rb
pathway-0.11.1 lib/pathway/plugins/responder.rb
pathway-0.11.0 lib/pathway/plugins/responder.rb