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