1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
# frozen_string_literal: true
module Aws
module Rest
module Request
class QuerystringBuilder
include Seahorse::Model::Shapes
# Provide shape references and param values:
#
# [
# [shape_ref1, 123],
# [shape_ref2, "text"]
# ]
#
# Returns a querystring:
#
# "Count=123&Words=text"
#
# @param [Array<Array<Seahorse::Model::ShapeRef, Object>>] params An array of
# model shape references and request parameter value pairs.
#
# @return [String] Returns a built querystring
def build(params)
params.map do |(shape_ref, param_value)|
build_part(shape_ref, param_value)
end.join('&')
end
private
def build_part(shape_ref, param_value)
case shape_ref.shape
# supported scalar types
when StringShape, BooleanShape, FloatShape, IntegerShape, StringShape
param_name = shape_ref.location_name
"#{param_name}=#{escape(param_value.to_s)}"
when TimestampShape
param_name = shape_ref.location_name
"#{param_name}=#{escape(timestamp(shape_ref, param_value))}"
when MapShape
if StringShape === shape_ref.shape.value.shape
query_map_of_string(param_value)
elsif ListShape === shape_ref.shape.value.shape
query_map_of_string_list(param_value)
else
msg = "only map of string and string list supported"
raise NotImplementedError, msg
end
when ListShape
if StringShape === shape_ref.shape.member.shape
list_of_strings(shape_ref.location_name, param_value)
else
msg = "Only list of strings supported, got "\
"#{shape_ref.shape.member.shape.class.name}"
raise NotImplementedError, msg
end
else
raise NotImplementedError
end
end
def timestamp(ref, value)
case ref['timestampFormat'] || ref.shape['timestampFormat']
when 'unixTimestamp' then value.to_i
when 'rfc822' then value.utc.httpdate
else
# querystring defaults to iso8601
value.utc.iso8601
end
end
def query_map_of_string(hash)
list = []
hash.each_pair do |key, value|
list << "#{escape(key)}=#{escape(value)}"
end
list
end
def query_map_of_string_list(hash)
list = []
hash.each_pair do |key, values|
values.each do |value|
list << "#{escape(key)}=#{escape(value)}"
end
end
list
end
def list_of_strings(name, values)
values.map do |value|
"#{name}=#{escape(value)}"
end
end
def escape(string)
Seahorse::Util.uri_escape(string)
end
end
end
end
end
|