checkoff 0.58.1 → 0.60.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Checkoff
4
+ # Base class to evaluate Asana resource selectors against an Asana resource
5
+ class SelectorEvaluator
6
+ # @param selector [Array]
7
+ # @return [Boolean, Object, nil]
8
+ def evaluate(selector)
9
+ return true if selector.empty?
10
+
11
+ function_evaluators.each do |evaluator_class|
12
+ # @type [SelectorClasses::FunctionEvaluator]
13
+ # @sg-ignore
14
+ evaluator = evaluator_class.new(selector: selector,
15
+ **initializer_kwargs)
16
+
17
+ next unless evaluator.matches?
18
+
19
+ return try_this_evaluator(selector, evaluator)
20
+ end
21
+
22
+ raise "Syntax issue trying to handle #{selector.inspect}"
23
+ end
24
+
25
+ private
26
+
27
+ # @return [Hash]
28
+ def initializer_kwargs
29
+ {}
30
+ end
31
+
32
+ # @return [Array<Class<FunctionEvaluator>>]
33
+ # @sg-ignore
34
+ def function_evaluators
35
+ raise 'Implement me!'
36
+ end
37
+
38
+ # @param selector [Array]
39
+ # @param evaluator [SelectorClasses::FunctionEvaluator]
40
+ # @return [Array]
41
+ def evaluate_args(selector, evaluator)
42
+ return [] unless selector.is_a?(Array)
43
+
44
+ selector[1..].map.with_index do |item, index|
45
+ if evaluator.evaluate_arg?(index)
46
+ evaluate(item)
47
+ else
48
+ item
49
+ end
50
+ end
51
+ end
52
+
53
+ # @param selector [Array]
54
+ # @param evaluator [SelectorClasses::FunctionEvaluator]
55
+ # @return [Boolean, Object, nil]
56
+ def try_this_evaluator(selector, evaluator)
57
+ # if selector is an array
58
+ evaluated_args = evaluate_args(selector, evaluator)
59
+
60
+ evaluator.evaluate(item, *evaluated_args)
61
+ end
62
+
63
+ # @return [Asana::Resources::Resource]
64
+ attr_reader :item
65
+ end
66
+ end