module Strum::Service
Strum
service
Constants
- COERCIVE_METHODS
Define coercive methods
- VERSION
Attributes
_inputs[RW]
inputs[RW]
outputs[RW]
service_handlers[RW]
strum_errors[RW]
Public Class Methods
included(base)
click to toggle source
# File lib/strum/service.rb, line 10 def self.included(base) base.class_eval do extend ClassMethods end end
new(main_input, args = {})
click to toggle source
Instance methods
# File lib/strum/service.rb, line 36 def initialize(main_input, args = {}) self.strum_errors = {} self.service_handlers = { on: {}, success: {}, failure: {} } self.outputs = {} self.inputs = args.merge(default: main_input) self._inputs = inputs.dup.freeze setup_default_proc setup_input_default_proc end
Public Instance Methods
errors()
click to toggle source
# File lib/strum/service.rb, line 63 def errors strum_errors end
execute() { |self| ... }
click to toggle source
# File lib/strum/service.rb, line 46 def execute catch(:exit) do audit yield(self) if block_given? call if valid? end valid? ? valid_result : invalid_result end
failure(arg = nil, &block)
click to toggle source
# File lib/strum/service.rb, line 75 def failure(arg = nil, &block) service_handlers[:failure][arg] = block end
hook(name, data = self)
click to toggle source
# File lib/strum/service.rb, line 55 def hook(name, data = self) service_handlers[:on][name].is_a?(Proc) && service_handlers[:on][name].call(data) end
method_missing(method_name, *args, &_block)
click to toggle source
Calls superclass method
# File lib/strum/service.rb, line 79 def method_missing(method_name, *args, &_block) if args.count.zero? && (input.is_a?(Hash) && input.keys.include?(method_name.to_sym)) input[method_name.to_sym] else inputs[method_name.to_sym] || super end end
on(arg, &block)
click to toggle source
# File lib/strum/service.rb, line 67 def on(arg, &block) service_handlers[:on][arg] = block end
respond_to_missing?(method_name, include_private = false)
click to toggle source
Calls superclass method
# File lib/strum/service.rb, line 87 def respond_to_missing?(method_name, include_private = false) input.is_a?(Hash) && input[method_name.to_sym] || super end
success(arg = nil, &block)
click to toggle source
# File lib/strum/service.rb, line 71 def success(arg = nil, &block) service_handlers[:success][arg] = block end
valid?()
click to toggle source
# File lib/strum/service.rb, line 59 def valid? strum_errors.empty? end
Protected Instance Methods
_input()
click to toggle source
# File lib/strum/service.rb, line 109 def _input _inputs[:default] end
add_error(field, value)
click to toggle source
def add_error
(field, value)
if field.is_a?(Array) field.each do |key| value.is_a?(Array) ? value.each { |v| add_error(key, v) } : add_error(key, value) add_error(key, value.is_a?(Array) ? value.first : value) end else strum_errors[field] ||= [] strum_errors[field] = strum_errors[field] + Array(value) end
end
# File lib/strum/service.rb, line 139 def add_error(field, value) strum_errors[field] ||= [] strum_errors[field] += Array(value) end
add_errors(errors)
click to toggle source
# File lib/strum/service.rb, line 144 def add_errors(errors) errors.each { |field, value| add_error(field, value) } end
any(*keys)
click to toggle source
# File lib/strum/service.rb, line 156 def any(*keys) if input.is_a?(Hash) add_error(:input, :any_field_must_exist) unless (keys & input.keys).count.positive? else add_error(:input, :must_be_hash) end end
args()
click to toggle source
# File lib/strum/service.rb, line 113 def args inputs.slice(*inputs.keys - [:default]) end
array!()
click to toggle source
# File lib/strum/service.rb, line 184 def array! self.input = [*input] end
audit()
click to toggle source
# File lib/strum/service.rb, line 99 def audit; end
call()
click to toggle source
# File lib/strum/service.rb, line 95 def call raise Failure, "call method must be implemented" end
input()
click to toggle source
# File lib/strum/service.rb, line 101 def input inputs[:default] end
input=(value)
click to toggle source
# File lib/strum/service.rb, line 105 def input=(value) inputs[:default] = value end
output(key = :default, value)
click to toggle source
rubocop: disable Style/OptionalArguments
# File lib/strum/service.rb, line 122 def output(key = :default, value) @outputs[key] = value end
output_value(key = :default)
click to toggle source
# File lib/strum/service.rb, line 117 def output_value(key = :default) @outputs[key] end
required(*keys)
click to toggle source
# File lib/strum/service.rb, line 148 def required(*keys) if input.is_a?(Hash) (keys - input.keys).each { |key| add_error(key, :field_must_exist) } else add_error(:input, :must_be_hash) end end
sliced(*keys)
click to toggle source
# File lib/strum/service.rb, line 164 def sliced(*keys) if input.is_a?(Hash) self.input = input.slice(*keys) else add_error(:input, :must_be_hash) end end
sliced_list(*keys)
click to toggle source
# File lib/strum/service.rb, line 172 def sliced_list(*keys) add_error(:input, :must_be_array) && retuen unless input.is_a?(Array) self.input = input.map do |item| if item.is_a?(Hash) item.slice(*keys) else add_error(:input_subitem, :must_be_hash) end end end
Private Instance Methods
handler()
click to toggle source
# File lib/strum/service.rb, line 208 def handler service_handlers[:success][handler_key] end
handler_key()
click to toggle source
# File lib/strum/service.rb, line 204 def handler_key ((outputs.keys << nil) & service_handlers[:success].keys).first end
invalid_result()
click to toggle source
# File lib/strum/service.rb, line 220 def invalid_result handler = service_handlers[:failure][((errors.values.flatten << nil) & service_handlers[:failure].keys).first] handler.call(errors) if handler.is_a?(Proc) end
key_to_sym(key)
click to toggle source
# File lib/strum/service.rb, line 198 def key_to_sym(key) key.to_sym rescue StandardError key end
setup_default_proc()
click to toggle source
# File lib/strum/service.rb, line 190 def setup_default_proc inputs.default_proc = proc { |h, k| h.key?(k.to_s) ? h[k.to_s] : nil } end
setup_input_default_proc()
click to toggle source
# File lib/strum/service.rb, line 194 def setup_input_default_proc input.default_proc = proc { |h, k| h.key?(k.to_s) ? h[k.to_s] : nil } if input.is_a?(Hash) end
valid_result()
click to toggle source
# File lib/strum/service.rb, line 212 def valid_result if handler.is_a?(Proc) handler.call(outputs[handler_key] || outputs[:default]) else outputs[handler_key] || outputs[:default] end end