Class: A2A::Faraday::Middleware::REST::Response

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/a2a/faraday/middleware/rest/response.rb

Overview

Faraday response middleware for the A2A HTTP+JSON/REST binding.

Unlike the JSON-RPC binding, REST responses have no envelope —the body IS the result directly. Errors are signaled via HTTP status codes with application/problem+json bodies.

Reads env.request.context to determine which Schema class to instantiate. If no operation is set, passes through.

Instance Method Summary collapse

Instance Method Details

#on_complete(env) ⇒ Object



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
# File 'lib/a2a/faraday/middleware/rest/response.rb', line 22

def on_complete(env)
  operation = env.request.context&.dig(:a2a_operation)
  return unless operation

  if env.status >= 400
    parsed = env.body
    if parsed.is_a?(Hash)
      message = parsed["title"] || parsed["message"] || parsed.to_s
      data    = parsed["detail"]
    else
      message = parsed.to_s
      data    = nil
    end
    raise A2A::RestError.new(message, http_status: env.status, data: data)
  end

  parsed = env.body
  return if parsed.nil?

  if parsed.is_a?(String)
    return if parsed.empty?
    parsed = JSON.parse(parsed)
  end

  schema_class = operation.response_schema
  unless schema_class
    env.body = parsed
    return
  end

  env.body = schema_class.new(parsed)
rescue JSON::ParserError
  # Leave body as-is if JSON parsing fails
end