class JMESPath::Nodes::SortByFunction

Public Instance Methods

call(args) click to toggle source
# File lib/jmespath/nodes/function.rb, line 471
def call(args)
  if args.count == 2
    if get_type(args[0]) == ARRAY_TYPE && get_type(args[1]) == EXPRESSION_TYPE
      values = args[0].to_ary
      expression = args[1]
      array_type = get_type(expression.eval(values[0]))
      if array_type == STRING_TYPE || array_type == NUMBER_TYPE || values.empty?
        # stable sort the list
        n = 0
        values.sort_by do |value|
          value = expression.eval(value)
          value_type = get_type(value)
          if value_type != array_type
            msg = 'function sort() expects values to be an array of only numbers, or only integers'
            return maybe_raise Errors::InvalidTypeError, msg
          end
          n += 1
          [value, n]
        end
      else
        return maybe_raise Errors::InvalidTypeError, 'function sort() expects values to be an array of numbers or integers'
      end
    else
      return maybe_raise Errors::InvalidTypeError, 'function sort_by() expects an array and an expression'
    end
  else
    return maybe_raise Errors::InvalidArityError, 'function sort_by() expects two arguments'
  end
end