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
|
# frozen_string_literal: true
module Aws
module Rest
module Response
class Body
include Seahorse::Model::Shapes
# @param [Class] parser_class
# @param [Seahorse::Model::ShapeRef] rules
def initialize(parser_class, rules)
@parser_class = parser_class
@rules = rules
end
# @param [IO] body
# @param [Hash, Struct] data
def apply(body, data)
if event_stream?
data[@rules[:payload]] = parse_eventstream(body)
elsif streaming?
data[@rules[:payload]] = body
elsif @rules[:payload]
data[@rules[:payload]] = parse(body.read, @rules[:payload_member])
elsif !@rules.shape.member_names.empty?
parse(body.read, @rules, data)
end
end
private
def event_stream?
@rules[:payload] && @rules[:payload_member].eventstream
end
def streaming?
@rules[:payload] && (
BlobShape === @rules[:payload_member].shape ||
StringShape === @rules[:payload_member].shape
)
end
def parse(body, rules, target = nil)
@parser_class.new(rules).parse(body, target) if body.size > 0
end
def parse_eventstream(body)
# body contains an array of parsed event when they arrive
@rules[:payload_member].shape.struct_class.new do |payload|
body.each { |event| payload << event }
end
end
end
end
end
end
|