class Protein::Service

Attributes

errors[R]
request[R]
response[R]

Public Class Methods

new(request) click to toggle source
# File lib/protein/service.rb, line 50
def initialize(request)
  @request = request
end
proto(proto_module = nil) click to toggle source
# File lib/protein/service.rb, line 12
def proto(proto_module = nil)
  @proto_module = proto_module
  @service_name ||= proto_module.to_s.split("::").last.
    scan(/[A-Z][^A-Z]*/).map(&:downcase).join("_")
  @request_class ||= "#{proto_module}::Request"
  @response_class ||= "#{proto_module}::Response"
end
proto_module() click to toggle source
# File lib/protein/service.rb, line 20
def proto_module
  GetConst.call(@proto_module)
end
request(request_class) click to toggle source
# File lib/protein/service.rb, line 24
def request(request_class)
  @request_class = request_class
end
request_class() click to toggle source
# File lib/protein/service.rb, line 28
def request_class
  GetConst.call(@request_class)
end
response(response_class) click to toggle source
# File lib/protein/service.rb, line 39
def response(response_class)
  @response_class = response_class
end
response?() click to toggle source
# File lib/protein/service.rb, line 32
def response?
  response_class != false &&
    (!response_class.is_a?(String) || !(Object.const_get(response_class) rescue nil).nil?)
rescue NameError
  false
end
response_class() click to toggle source
# File lib/protein/service.rb, line 43
def response_class
  GetConst.call(@response_class)
end
service(service_name) click to toggle source
# File lib/protein/service.rb, line 4
def service(service_name)
  @service_name = service_name
end
service_name() click to toggle source
# File lib/protein/service.rb, line 8
def service_name
  @service_name || raise(DefinitionError, "service name is not defined")
end

Public Instance Methods

add_error(*args) click to toggle source
# File lib/protein/service.rb, line 116
def add_error(*args)
  @errors << build_error(*args)
end
failure?() click to toggle source
# File lib/protein/service.rb, line 112
def failure?
  !success?
end
process() click to toggle source
# File lib/protein/service.rb, line 62
def process
  @success = nil
  @response = response_class.new if response?
  @errors = []

  call

  raise(ProcessingError, "resolve/reject must be called") if response? && @success.nil?
end
reject(*args) click to toggle source
# File lib/protein/service.rb, line 87
def reject(*args)
  raise(ProcessingError, "can't reject non-responding service") unless response?
  if args.any? && @errors && @errors.any?
    raise(ProcessingError, "unable to reject with both rejection value and previous errors")
  end

  @success = false
  @errors =
    if args.empty? && @errors && @errors.any?
      @errors
    elsif args.empty?
      [build_error(:error)]
    elsif args.length == 1 && args[0].is_a?(Array) && args[0].any?
      args[0].map { |error| build_error(error) }
    else
      [build_error(*args)]
    end
end
resolve(response = nil) click to toggle source
# File lib/protein/service.rb, line 72
def resolve(response = nil)
  raise(ProcessingError, "can't resolve non-responding service") unless response?
  raise(ProcessingError, "unable to resolve with previous errors") if @errors && @errors.any?

  @success = true
  @response =
    if !response
      @response
    elsif response.is_a?(response_class)
      response
    else
      response_class.new(response)
    end
end
response?() click to toggle source
# File lib/protein/service.rb, line 54
def response?
  self.class.response?
end
response_class() click to toggle source
# File lib/protein/service.rb, line 58
def response_class
  self.class.response_class
end
success?() click to toggle source
# File lib/protein/service.rb, line 106
def success?
  raise(ProcessingError, "resolve/reject must be called first") if @success.nil?

  @success
end

Private Instance Methods

build_error(*args) click to toggle source
# File lib/protein/service.rb, line 122
def build_error(*args)
  if args[0].is_a?(String) || args[0].is_a?(Symbol)
    reason = args[0]
    pointer =
      if args[1].is_a?(Hash) && (at = args[1][:at])
        Pointer.new(request, "request", at)
      end

    ServiceError.new(reason: reason, pointer: pointer)
  elsif args[0].is_a?(ServiceError)
    args[0]
  elsif args[0].is_a?(Hash)
    ServiceError.new(reason: args[0][:reason], pointer: args[0][:pointer])
  end
end