class Aws::Binary::EventParser

def parse_event(raw_event)

def parse_event(raw_event)
  event_type = raw_event.headers.delete(":event-type").value
  # content_type = raw_event.headers.delete(":content-type").value
  if event_type == 'initial-response'
    event = Struct.new(:event_type, :response).new
    event.event_type = :initial_response
    event.response = parse_payload(raw_event.payload.read, @output_ref)
    return event
  end
  # locate event from eventstream
  name, ref = @rules.shape.member_by_location_name(event_type)
  unless ref && ref.event
    return Struct.new(:event_type, :raw_event_type, :raw_event)
                 .new(:unknown_event, event_type, raw_event)
  end
  event = ref.shape.struct_class.new
  explicit_payload = false
  implicit_payload_members = {}
  ref.shape.members.each do |member_name, member_ref|
    unless member_ref.eventheader
      if member_ref.eventpayload
        explicit_payload = true
      else
        implicit_payload_members[member_name] = member_ref
      end
    end
  end
  # implicit payload
  if !explicit_payload && !implicit_payload_members.empty?
    event = parse_payload(raw_event.payload.read, ref)
  end
  event.event_type = name
  # locate payload and headers in the event
  ref.shape.members.each do |member_name, member_ref|
    if member_ref.eventheader
      # allow incomplete event members in response
      if raw_event.headers.key?(member_ref.location_name)
        event.send("#{member_name}=", raw_event.headers[member_ref.location_name].value)
      end
    elsif member_ref.eventpayload
      # explicit payload
      eventpayload_streaming?(member_ref) ?
       event.send("#{member_name}=", raw_event.payload) :
       event.send("#{member_name}=", parse_payload(raw_event.payload.read, member_ref))
    end
  end
  event
end