Class: Mutations::CommandReturningArray

Inherits:
CommandReturningHash show all
Defined in:
lib/mutations/command_returning_array.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from CommandReturningHash

#errors?, #has_outcome_errors?, #initialize, outcome_descriptions, #outcome_filters, outcome_filters, #run!, #validation_outcome

Methods inherited from Command

input_descriptions, yo!

Constructor Details

This class inherits a constructor from Mutations::CommandReturningHash

Class Method Details

.create_outcome_attr_methods(meth, &block) ⇒ Object



6
7
8
9
10
11
12
13
# File 'lib/mutations/command_returning_array.rb', line 6

def create_outcome_attr_methods(meth, &block)
  outcome_filters.send(meth, &block)
  keys = outcome_filters.send("#{meth}_keys")
  keys.each do |key|
    define_method("outcome_#{key}") { @outputs.map { |o| o[key] } }
    define_method("outcome_#{key}_present?") { @outputs.map { |o| o.key?(key) } }
  end
end

.outcome_optional(&block) ⇒ Object



27
28
29
# File 'lib/mutations/command_returning_array.rb', line 27

def outcome_optional(&block)
  create_outcome_attr_methods(:outcome_optional, &block)
end

.outcome_required(&block) ⇒ Object

%i(required optional).each do |m|

meth = :"outcome_#{m}"
define_method(meth) do |&block|
  create_outcome_attr_methods(meth, &block)
end

end



23
24
25
# File 'lib/mutations/command_returning_array.rb', line 23

def outcome_required(&block)
  create_outcome_attr_methods(:outcome_required, &block)
end

Instance Method Details

#errorsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/mutations/command_returning_array.rb', line 32

def errors
  return nil unless errors?

  ErrorHash.new.tap do |h|
    h.merge! @errors if has_errors?

    case @outcome_errors
    when ErrorHash then h.merge! @outcome_errors
    when Hash
      h.merge!(@outcome_errors.each_with_object({}) do |(idx, err), memo|
        memo.merge! err[:errors].map { |k, v| [:"#{k}_#{idx}", v] }.to_h
      end)
    end
  end
end

#runObject



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/mutations/command_returning_array.rb', line 48

def run
  return validation_outcome if has_errors?
  validation_outcome(
    execute.tap do |result|
      case result
      when Array
        result.each_with_index.with_object({}) do |(e, i), memo|
          _, outcome_error = self.class.outcome_filters.filter(e)
          outcome_error = validate_outcome(e) if outcome_error.nil?
          memo[i] = { outcome: e, errors: outcome_error } unless outcome_error.nil?
        end.tap do |errs|
          @outcome_errors = errs unless errs.empty?
        end
      when NilClass then nil
      else add_outcome_error :self, :type, "This mutation must return Array instance (was #{result.class})"
      end
    end
  )
end