mirror of
https://github.com/rest-client/rest-client.git
synced 2022-11-09 13:49:40 -05:00
bfc9fd6719
We're about to call .map on it anyway.
72 lines
2 KiB
Ruby
72 lines
2 KiB
Ruby
module RestClient
|
|
|
|
# The ParamsArray class is used to represent an ordered list of [key, value]
|
|
# pairs. Use this when you need to include a key multiple times or want
|
|
# explicit control over parameter ordering.
|
|
#
|
|
# Most of the request payload & parameter functions normally accept a Hash of
|
|
# keys => values, which does not allow for duplicated keys.
|
|
#
|
|
# @see RestClient::Utils.encode_query_string
|
|
# @see RestClient::Utils.flatten_params
|
|
#
|
|
class ParamsArray
|
|
include Enumerable
|
|
|
|
# @param array [Array<Array>] An array of parameter key,value pairs. These
|
|
# pairs may be 2 element arrays [key, value] or single element hashes
|
|
# {key => value}. They may also be single element arrays to represent a
|
|
# key with no value.
|
|
#
|
|
# @example
|
|
# >> ParamsArray.new([[:foo, 123], [:foo, 456], [:bar, 789]])
|
|
# This will be encoded as "foo=123&foo=456&bar=789"
|
|
#
|
|
# @example
|
|
# >> ParamsArray.new({foo: 123, bar: 456})
|
|
# This is valid, but there's no reason not to just use the Hash directly
|
|
# instead of a ParamsArray.
|
|
#
|
|
#
|
|
def initialize(array)
|
|
@array = process_input(array)
|
|
end
|
|
|
|
def each(*args, &blk)
|
|
@array.each(*args, &blk)
|
|
end
|
|
|
|
def empty?
|
|
@array.empty?
|
|
end
|
|
|
|
private
|
|
|
|
def process_input(array)
|
|
array.map {|v| process_pair(v) }
|
|
end
|
|
|
|
# A pair may be:
|
|
# - A single element hash, e.g. {foo: 'bar'}
|
|
# - A two element array, e.g. ['foo', 'bar']
|
|
# - A one element array, e.g. ['foo']
|
|
#
|
|
def process_pair(pair)
|
|
case pair
|
|
when Hash
|
|
if pair.length != 1
|
|
raise ArgumentError.new("Bad # of fields for pair: #{pair.inspect}")
|
|
end
|
|
pair.to_a.fetch(0)
|
|
when Array
|
|
if pair.length > 2
|
|
raise ArgumentError.new("Bad # of fields for pair: #{pair.inspect}")
|
|
end
|
|
[pair.fetch(0), pair[1]]
|
|
else
|
|
# recurse, converting any non-array to an array
|
|
process_pair(pair.to_a)
|
|
end
|
|
end
|
|
end
|
|
end
|