module RubyLLM::Providers::Bedrock::Streaming::PayloadProcessing

def build_chunk(data)

def build_chunk(data)
  Chunk.new(
    **extract_chunk_attributes(data)
  )
end

def create_and_yield_chunk(data, &block)

def create_and_yield_chunk(data, &block)
  block.call(build_chunk(data))
end

def decode_and_parse_data(json_data)

def decode_and_parse_data(json_data)
  decoded_bytes = Base64.strict_decode64(json_data['bytes'])
  JSON.parse(decoded_bytes)
end

def extract_chunk_attributes(data)

def extract_chunk_attributes(data)
  {
    role: :assistant,
    model_id: extract_model_id(data),
    content: extract_streaming_content(data),
    input_tokens: extract_input_tokens(data),
    output_tokens: extract_output_tokens(data),
    tool_calls: extract_tool_calls(data)
  }
end

def extract_json_payload(payload)

def extract_json_payload(payload)
  json_start = payload.index('{')
  json_end = payload.rindex('}')
  payload[json_start..json_end]
end

def log_general_error(error)

def log_general_error(error)
  RubyLLM.logger.debug "Error processing payload: #{error.message}"
end

def log_json_parse_error(error, json_payload)

def log_json_parse_error(error, json_payload)
  RubyLLM.logger.debug "Failed to parse payload as JSON: #{error.message}"
  RubyLLM.logger.debug "Attempted JSON payload: #{json_payload.inspect}"
end

def parse_and_process_json(json_payload, &)

def parse_and_process_json(json_payload, &)
  json_data = JSON.parse(json_payload)
  process_json_data(json_data, &)
end

def process_json_data(json_data, &)

def process_json_data(json_data, &)
  return unless json_data['bytes']
  data = decode_and_parse_data(json_data)
  create_and_yield_chunk(data, &)
end

def process_payload(payload, &)

def process_payload(payload, &)
  json_payload = extract_json_payload(payload)
  parse_and_process_json(json_payload, &)
rescue JSON::ParserError => e
  log_json_parse_error(e, json_payload)
rescue StandardError => e
  log_general_error(e)
end