From aed4529d59e8faee37377994ce0a767553774245 Mon Sep 17 00:00:00 2001 From: Lansana Camara Date: Fri, 16 Oct 2026 19:20:18 +0000 Subject: [PATCH] fix(ios): accept application/a2ui+json in A2AResponseParser PiperOrigin-RevId: 1001021272 --- .../GoogleMapsA2UI/A2AResponseParser.swift | 3 ++- .../Tests/A2AResponseParserTests.swift | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/client/ios/GoogleMapsA2UI/Sources/GoogleMapsA2UI/A2AResponseParser.swift b/client/ios/GoogleMapsA2UI/Sources/GoogleMapsA2UI/A2AResponseParser.swift index 55f99fc..c1feff7 100644 --- a/client/ios/GoogleMapsA2UI/Sources/GoogleMapsA2UI/A2AResponseParser.swift +++ b/client/ios/GoogleMapsA2UI/Sources/GoogleMapsA2UI/A2AResponseParser.swift @@ -28,6 +28,7 @@ public enum A2AParserError: Error { /// Declared as a case-less enum to prevent instantiation. public enum A2AResponseParser { private static let a2uiJsonMimeType = "application/json+a2ui" + private static let a2uiV1MimeType = "application/a2ui+json" private static let a2uiJsonTagOpen = "" private static let a2uiJsonTagClose = "" @@ -94,7 +95,7 @@ public enum A2AResponseParser { mimeType ?? (isA2UIPayload(dataPayload) ? a2uiJsonMimeType : nil) - if resolvedMimeType == a2uiJsonMimeType { + if resolvedMimeType == a2uiJsonMimeType || resolvedMimeType == a2uiV1MimeType { a2uiPayloads.append(dataPayload) } else { flushA2UI() diff --git a/client/ios/GoogleMapsA2UI/Tests/A2AResponseParserTests.swift b/client/ios/GoogleMapsA2UI/Tests/A2AResponseParserTests.swift index ac3f0d9..c8575dd 100644 --- a/client/ios/GoogleMapsA2UI/Tests/A2AResponseParserTests.swift +++ b/client/ios/GoogleMapsA2UI/Tests/A2AResponseParserTests.swift @@ -187,6 +187,32 @@ final class A2AResponseParserTests: XCTestCase { XCTAssertEqual(a2uiArray.count, 1) } + /// Tests that a data part with the standard `application/a2ui+json` mime type is parsed and batched into an array. + func testParse_dataPartWithStandardA2UIMimeType() throws { + let payload: [String: Any] = [ + "parts": [ + [ + "kind": "data", + "data": [ + "version": "v0.9", + "updateComponents": [ + "surfaceId": "sushi-seattle", + "components": [], + ], + ], + "metadata": ["mimeType": "application/a2ui+json"], + ] + ] + ] + + let events = try A2AResponseParser.parse(payload) + XCTAssertEqual(events.count, 1) + XCTAssertEqual(events.first?.metadataMimeType, "application/json+a2ui") + + let a2uiArray = try XCTUnwrap(events.first?.dataArray) + XCTAssertEqual(a2uiArray.count, 1) + } + /// Tests that a data part is inferred as A2UI if it contains recognized keys, even without a mime type. func testParse_dataPartWithImplicitA2UIKey() throws { let payload: [String: Any] = [