Class: Foobara::Value::Processor::Selection

Inherits:
Multi show all
Defined in:
foobara-0.0.110/projects/value/src/processor/selection.rb

Defined Under Namespace

Classes: MoreThanOneApplicableProcessorError, NoApplicableProcessorError

Instance Attribute Summary collapse

Attributes inherited from Multi

#prioritize, #processors

Attributes inherited from Foobara::Value::Processor

#created_in_namespace, #declaration_data, #parent_declaration_data

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Multi

#applicable?, #error_classes, #possible_errors, #processor_names, #register, requires_declaration_data?

Methods inherited from Foobara::Value::Processor

#applicable?, #attribute_name, #build_error, default_declaration_data, #dup_processor, error_class, error_classes, #error_path, #foobara_manifest, #inspect, instance, #method_missing, #name, new_with_agnostic_args, #possible_errors, #priority, #process_outcome, #process_outcome!, #process_value!, processor_name, requires_declaration_data?, requires_parent_declaration_data?, #respond_to_missing?, #runner, symbol

Methods included from IsManifestable

#foobara_domain, #foobara_manifest, #foobara_organization, #scoped_clear_caches

Methods included from Concern

foobara_class_methods_module_for, foobara_concern?, included

Constructor Details

#initialize(enforce_unique: true) ⇒ Selection

Returns a new instance of Selection.



21
22
23
24
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 21

def initialize(*, enforce_unique: true, **)
  self.enforce_unique = enforce_unique
  super(*, **)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Foobara::Value::Processor

Instance Attribute Details

#enforce_uniqueObject

Returns the value of attribute enforce_unique.



19
20
21
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 19

def enforce_unique
  @enforce_unique
end

Class Method Details

.foobara_manifestObject



12
13
14
15
16
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 12

def foobara_manifest
  # :nocov:
  super.merge(processor_type: :selection)
  # :nocov:
end

Instance Method Details

#always_applicable?Boolean

Returns:

  • (Boolean)


71
72
73
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 71

def always_applicable?
  true
end

#error_context(value) ⇒ Object

This is a problem… how do we know a base class won’t call this for a different error??



81
82
83
84
85
86
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 81

def error_context(value)
  {
    processor_names:,
    value:
  }
end

#error_message(value) ⇒ Object



75
76
77
78
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 75

def error_message(value)
  # TODO: should override this message so we say registry or caster or whatever based on the situation
  "Could not find processor that is applicable for #{value}"
end

#process_value(value) ⇒ Object

TODO: move applies_message usage here from casting processor



27
28
29
30
31
32
33
34
35
36
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 27

def process_value(value)
  outcome = processor_for(value)

  if outcome.success?
    processor = outcome.result
    outcome = processor.process_value(value)
  end

  outcome
end

#processor_for(value) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 38

def processor_for(value)
  processor = if enforce_unique
                applicable_processors = processors.select { |p| p.applicable?(value) }

                if applicable_processors.size > 1
                  return Outcome.error(
                    build_error(
                      value,
                      error_class: MoreThanOneApplicableProcessorError,
                      message: "More than one processor applicable for #{value}",
                      context: error_context(value).merge(
                        applicable_processor_names: applicable_processors.map(&:name)
                      )
                    )
                  )
                end

                applicable_processors.first
              else
                processors.find { |processor| processor.applicable?(value) }
              end

  if processor
    Outcome.success(processor)
  else
    Outcome.error(build_error(value, error_class: NoApplicableProcessorError))
  end
end

#processor_for!(value) ⇒ Object



67
68
69
# File 'foobara-0.0.110/projects/value/src/processor/selection.rb', line 67

def processor_for!(value)
  processor_for(value).result!
end