class Sift::ValueParser
Attributes
supports_boolean[R]
supports_json[R]
supports_json_object[R]
supports_ranges[R]
type[R]
value[R]
Public Class Methods
new(value:, type: nil, options: {})
click to toggle source
# File lib/sift/value_parser.rb, line 3 def initialize(value:, type: nil, options: {}) @value = value @supports_boolean = options.fetch(:supports_boolean, false) @supports_ranges = options.fetch(:supports_ranges, false) @supports_json = options.fetch(:supports_json, false) @supports_json_object = options.fetch(:supports_json_object, false) @value = normalized_value(value, type) end
Public Instance Methods
array_from_json()
click to toggle source
# File lib/sift/value_parser.rb, line 42 def array_from_json result = parse_json(value) if result.is_a?(Array) result else value end end
parse()
click to toggle source
# File lib/sift/value_parser.rb, line 12 def parse @_result ||= if parse_as_range? range_value elsif parse_as_boolean? boolean_value elsif parse_as_json? supports_json_object ? parse_json_and_values : array_from_json else value end end
parse_json(string)
click to toggle source
# File lib/sift/value_parser.rb, line 25 def parse_json(string) JSON.parse(string) rescue JSON::ParserError string end
parse_json_and_values()
click to toggle source
# File lib/sift/value_parser.rb, line 31 def parse_json_and_values parsed_jsonb = parse_json(value) return parsed_jsonb if parsed_jsonb.is_a?(Array) || parsed_jsonb.is_a?(String) parsed_jsonb.each_with_object({}) do |key_value, hash| key = key_value.first value = key_value.last hash[key] = value.is_a?(String) ? parse_json(value) : value end end
Private Instance Methods
boolean_value()
click to toggle source
# File lib/sift/value_parser.rb, line 71 def boolean_value if Rails.version.to_i >= 5 ActiveRecord::Type::Boolean.new.cast(value) else ActiveRecord::Type::Boolean.new.type_cast_from_user(value) end end
normalized_date_range(raw_value)
click to toggle source
# File lib/sift/value_parser.rb, line 87 def normalized_date_range(raw_value) from_date_string, end_date_string = raw_value.split("...") return unless end_date_string parsed_dates = [from_date_string, end_date_string].map do |date_string| begin DateTime.parse(date_string.to_s) rescue StandardError date_string end end parsed_dates.join("...") end
normalized_value(raw_value, type)
click to toggle source
# File lib/sift/value_parser.rb, line 79 def normalized_value(raw_value, type) if type == :datetime && parse_as_range?(raw_value) normalized_date_range(raw_value) else raw_value end end
parse_as_boolean?()
click to toggle source
# File lib/sift/value_parser.rb, line 67 def parse_as_boolean? supports_boolean end
parse_as_json?()
click to toggle source
# File lib/sift/value_parser.rb, line 63 def parse_as_json? supports_json && value.is_a?(String) end
parse_as_range?(raw_value=value)
click to toggle source
# File lib/sift/value_parser.rb, line 55 def parse_as_range?(raw_value=value) supports_ranges && raw_value.to_s.include?("...") end
range_value()
click to toggle source
# File lib/sift/value_parser.rb, line 59 def range_value Range.new(*value.split("...")) end