lib/floe/workflow/choice_rule/data.rb in floe-0.15.0 vs lib/floe/workflow/choice_rule/data.rb in floe-0.15.1
- old
+ new
@@ -9,11 +9,11 @@
# e.g.: (Is)(String), (Is)(Present)
TYPE_CHECK = /^(Is)(#{TYPES.join("|")})$/.freeze
# e.g.: (String)(LessThan)(Path), (Numeric)(GreaterThanEquals)()
OPERATION = /^(#{(TYPES - %w[Null Present]).join("|")})(#{COMPARES.join("|")})(Path)?$/.freeze
- attr_reader :variable, :compare_key, :type, :compare_predicate, :path
+ attr_reader :variable, :compare_key, :operation, :type, :compare_predicate, :path
def initialize(_workflow, _name, payload)
super
@variable = parse_path("Variable")
@@ -23,43 +23,11 @@
def true?(context, input)
return presence_check(context, input) if compare_key == "IsPresent"
lhs = variable_value(context, input)
rhs = compare_value(context, input)
-
- case compare_key
- when "IsNull" then is_null?(lhs, rhs)
- when "IsNumeric" then is_numeric?(lhs, rhs)
- when "IsString" then is_string?(lhs, rhs)
- when "IsBoolean" then is_boolean?(lhs, rhs)
- when "IsTimestamp" then is_timestamp?(lhs, rhs)
- when "StringEquals", "StringEqualsPath",
- "NumericEquals", "NumericEqualsPath",
- "BooleanEquals", "BooleanEqualsPath",
- "TimestampEquals", "TimestampEqualsPath"
- lhs == rhs
- when "StringLessThan", "StringLessThanPath",
- "NumericLessThan", "NumericLessThanPath",
- "TimestampLessThan", "TimestampLessThanPath"
- lhs < rhs
- when "StringGreaterThan", "StringGreaterThanPath",
- "NumericGreaterThan", "NumericGreaterThanPath",
- "TimestampGreaterThan", "TimestampGreaterThanPath"
- lhs > rhs
- when "StringLessThanEquals", "StringLessThanEqualsPath",
- "NumericLessThanEquals", "NumericLessThanEqualsPath",
- "TimestampLessThanEquals", "TimestampLessThanEqualsPath"
- lhs <= rhs
- when "StringGreaterThanEquals", "StringGreaterThanEqualsPath",
- "NumericGreaterThanEquals", "NumericGreaterThanEqualsPath",
- "TimestampGreaterThanEquals", "TimestampGreaterThanEqualsPath"
- lhs >= rhs
- when "StringMatches"
- lhs.match?(Regexp.escape(rhs).gsub('\*', '.*?'))
- else
- raise Floe::InvalidWorkflowError, "Invalid choice [#{compare_key}]"
- end
+ send(operation, lhs, rhs)
end
private
def presence_check(context, input)
@@ -110,29 +78,56 @@
!predicate
end
# rubocop:enable Naming/PredicateName
# rubocop:enable Style/OptionalBooleanParameter
+ def equals?(lhs, rhs)
+ lhs == rhs
+ end
+
+ def lessthan?(lhs, rhs)
+ lhs < rhs
+ end
+
+ def greaterthan?(lhs, rhs)
+ lhs > rhs
+ end
+
+ def lessthanequals?(lhs, rhs)
+ lhs <= rhs
+ end
+
+ def greaterthanequals?(lhs, rhs)
+ lhs >= rhs
+ end
+
+ def matches?(lhs, rhs)
+ lhs.match?(Regexp.escape(rhs).gsub('\*', '.*?'))
+ end
+
# parse the compare key at initialization time
def parse_compare_key
payload.each_key do |key|
# e.g. (String)(GreaterThan)(Path)
if (match_values = OPERATION.match(key))
@compare_key = key
- @type, _operator, @path = match_values.captures
+ @type, operator, @path = match_values.captures
+ @operation = "#{operator.downcase}?".to_sym
@compare_predicate = parse_predicate(type)
break
end
# e.g. (Is)(String)
- if TYPE_CHECK.match?(key)
+ if (match_value = TYPE_CHECK.match(key))
@compare_key = key
+ _operator, type = match_value.captures
# type: nil means no runtime type checking.
@type = @path = nil
+ @operation = "is_#{type.downcase}?".to_sym
@compare_predicate = parse_predicate("Boolean")
break
end
end
- parser_error!("requires a compare key") unless compare_key
+ parser_error!("requires a compare key") if compare_key.nil? || operation.nil?
end
# parse predicate at initilization time
# @return the right predicate attached to the compare key
def parse_predicate(data_type)