Sha256: 180d385404cd36221c3af4afd6ebcfd2c7ccd72c44d8a9d9a6e1a106479cb906

Contents?: true

Size: 1.09 KB

Versions: 3

Compression:

Stored size: 1.09 KB

Contents

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

3 entries across 3 versions & 1 rubygems

Version Path
pathway-0.10.0 lib/pathway/plugins/responder.rb
pathway-0.9.1 lib/pathway/plugins/responder.rb
pathway-0.9.0 lib/pathway/plugins/responder.rb