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