module JMESPath::Nodes::CompareBy

Public Instance Methods

compare_by(mode, *args) click to toggle source
# File lib/jmespath/nodes/function.rb, line 493
def compare_by(mode, *args)
  if args.count == 2
    values = args[0]
    expression = args[1]
    if get_type(values) == ARRAY_TYPE && get_type(expression) == EXPRESSION_TYPE
      type = get_type(expression.eval(values.first))
      if type != NUMBER_TYPE && type != STRING_TYPE
        msg = "function #{mode}() expects values to be strings or numbers"
        return maybe_raise Errors::InvalidTypeError, msg
      end
      values.send(mode) do |entry|
        value = expression.eval(entry)
        value_type = get_type(value)
        if value_type != type
          msg = "function #{mode}() encountered a type mismatch in "
          msg << "sequence: #{type}, #{value_type}"
          return maybe_raise Errors::InvalidTypeError, msg
        end
        value
      end
    else
      msg = "function #{mode}() expects an array and an expression"
      return maybe_raise Errors::InvalidTypeError, msg
    end
  else
    msg = "function #{mode}() expects two arguments"
    return maybe_raise Errors::InvalidArityError, msg
  end
end