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