diff --git a/wire-runtime-swift/src/test/swift/AnyMessageTests.swift b/wire-runtime-swift/src/test/swift/AnyMessageTests.swift index a8dde6bd16..bd182a61f4 100644 --- a/wire-runtime-swift/src/test/swift/AnyMessageTests.swift +++ b/wire-runtime-swift/src/test/swift/AnyMessageTests.swift @@ -26,6 +26,14 @@ final class AnyMessageTests: XCTestCase { XCTAssertEqual(any.value, try ProtoEncoder().encode(person)) } + func testPackingFieldMask() throws { + let fieldMask = FieldMask(paths: ["user.display_name", "photo"]) + let any = try AnyMessage.pack(fieldMask) + XCTAssertEqual(any.typeURL, FieldMask.protoMessageTypeURL()) + XCTAssertEqual(any.value, try ProtoEncoder().encode(fieldMask)) + XCTAssertEqual(fieldMask, try any.unpack(FieldMask.self)) + } + func testUnpackingAnyToCorrectType() throws { let data = Data(json_data: "") let person = Person(name: "foo bar", id: 12345, data: data) diff --git a/wire-runtime/api/wire-runtime.api b/wire-runtime/api/wire-runtime.api index c8f802850f..2179e3baec 100644 --- a/wire-runtime/api/wire-runtime.api +++ b/wire-runtime/api/wire-runtime.api @@ -30,6 +30,7 @@ public final class com/squareup/wire/AnyMessage : com/squareup/wire/Message { public final class com/squareup/wire/AnyMessage$Companion { public final fun pack (Lcom/squareup/wire/Message;)Lcom/squareup/wire/AnyMessage; + public final fun pack (Lcom/squareup/wire/ProtoAdapter;Ljava/lang/Object;)Lcom/squareup/wire/AnyMessage; } public final class com/squareup/wire/DurationKt { diff --git a/wire-runtime/src/commonMain/kotlin/com/squareup/wire/AnyMessage.kt b/wire-runtime/src/commonMain/kotlin/com/squareup/wire/AnyMessage.kt index dc10e0c363..9e722a2d94 100644 --- a/wire-runtime/src/commonMain/kotlin/com/squareup/wire/AnyMessage.kt +++ b/wire-runtime/src/commonMain/kotlin/com/squareup/wire/AnyMessage.kt @@ -29,7 +29,9 @@ import okio.ByteString * Example * ``` * val person: Person = anyMessage.unpack(Person.ADAPTER) - * val anyMessage: AnyMessage = AnyMessage.ADAPTER.pack(person) + * val anyMessage: AnyMessage = AnyMessage.pack(person) + * val fieldMask = FieldMask(listOf("name")) + * val fieldMaskAny: AnyMessage = AnyMessage.pack(ProtoAdapter.FIELD_MASK, fieldMask) * ``` */ class AnyMessage( @@ -82,6 +84,12 @@ class AnyMessage( return AnyMessage(typeUrl, message.encodeByteString()) } + fun pack(adapter: ProtoAdapter, value: T): AnyMessage { + val typeUrl = adapter.typeUrl + ?: error("recompile ${adapter.type ?: "type"} to use it with AnyMessage") + return AnyMessage(typeUrl, adapter.encodeByteString(value)) + } + @JvmField val ADAPTER: ProtoAdapter = object : ProtoAdapter( FieldEncoding.LENGTH_DELIMITED, diff --git a/wire-tests/multiplatform/src/commonTest/kotlin/com/squareup/wire/AnyMessageTest.kt b/wire-tests/multiplatform/src/commonTest/kotlin/com/squareup/wire/AnyMessageTest.kt index 71b654eb82..5667d97029 100644 --- a/wire-tests/multiplatform/src/commonTest/kotlin/com/squareup/wire/AnyMessageTest.kt +++ b/wire-tests/multiplatform/src/commonTest/kotlin/com/squareup/wire/AnyMessageTest.kt @@ -59,6 +59,15 @@ class AnyMessageTest { assertThat(usesAny.just_one.unpackOrNull(ProtoAdapter.BOOL)).isEqualTo(null) } + @Test fun packAndUnpackRuntimeValue() { + val fieldMask = FieldMask(listOf("user.display_name", "photo")) + val any = AnyMessage.pack(ProtoAdapter.FIELD_MASK, fieldMask) + + assertThat(any.typeUrl).isEqualTo(ProtoAdapter.FIELD_MASK.typeUrl) + assertThat(any.value).isEqualTo(ProtoAdapter.FIELD_MASK.encodeByteString(fieldMask)) + assertThat(any.unpack(ProtoAdapter.FIELD_MASK)).isEqualTo(fieldMask) + } + @Test fun encodeAndDecode() { val hex = "0a430a3d747970652e676f6f676c65617069732e636f6d2f73717561726575702e70726f746f732e6b" + "6f746c696e2e6564676563617365732e4f6e654669656c641202080312430a3d747970652e676f6f676c6561" +