class JMESPath::Nodes::MinFunction

Public Instance Methods

call(args) click to toggle source
# File lib/jmespath/nodes/function.rb, line 265
def call(args)
  if args.count == 1
    values = args.first
  else
    return maybe_raise Errors::InvalidArityError, 'function min() expects one argument'
  end
  if values.respond_to?(:to_ary)
    values = values.to_ary
    return nil if values.empty?
    first = values.first
    first_type = get_type(first)
    unless first_type == NUMBER_TYPE || first_type == STRING_TYPE
      msg = String.new('function min() expects numeric or string values')
      return maybe_raise Errors::InvalidTypeError, msg
    end
    values.inject([first, first_type]) do |(min, min_type), v|
      v_type = get_type(v)
      if min_type == v_type
        v < min ? [v, v_type] : [min, min_type]
      else
        msg = String.new('function min() encountered a type mismatch in sequence: ')
        msg << "#{min_type}, #{v_type}"
        return maybe_raise Errors::InvalidTypeError, msg
      end
    end.first
  else
    return maybe_raise Errors::InvalidTypeError, 'function min() expects an array'
  end
end