Skip to content

Commit 574542c

Browse files
committed
fix(compiler): constrain Swift gRPC generics to self-provided serializers
Fory.deserialize requires Target == Self, so the generated marshaller and streaming carriers no longer compiled against a bare Serializer bound. Repeat that constraint on the six generic service declarations.
1 parent f7ea499 commit 574542c

1 file changed

Lines changed: 24 additions & 6 deletions

File tree

  • compiler/fory_compiler/generators/services

compiler/fory_compiler/generators/services/swift.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,10 @@ def _marshaller(self, base: str, module: str) -> list[str]:
166166
"// @unchecked Sendable: a transient per-message carrier handed to a single",
167167
"// consumer and (de)serialized synchronously, never shared across threads,",
168168
"// so grpc-swift's async APIs can move it under Swift 6 strict concurrency.",
169-
f"struct {base}Message<Value: Serializer>: GRPCPayload, @unchecked Sendable {{",
169+
(
170+
f"struct {base}Message<Value: Serializer>: GRPCPayload, @unchecked Sendable"
171+
" where Value.Target == Value {"
172+
),
170173
" let value: Value",
171174
" init(_ value: Value) { self.value = value }",
172175
" init(serializedByteBuffer buffer: inout NIOCore.ByteBuffer) throws {",
@@ -241,7 +244,10 @@ def _adapters(self, base: str, modes: set[StreamingMode]) -> list[str]:
241244

242245
def _streaming_response_context(self, base: str) -> list[str]:
243246
return [
244-
f"public struct {base}StreamingResponseContext<Response: Serializer> {{",
247+
(
248+
f"public struct {base}StreamingResponseContext<Response: Serializer>"
249+
" where Response.Target == Response {"
250+
),
245251
f" fileprivate let base: StreamingResponseCallContext<{base}Message<Response>>",
246252
" public var eventLoop: EventLoop { base.eventLoop }",
247253
" @discardableResult",
@@ -253,7 +259,10 @@ def _streaming_response_context(self, base: str) -> list[str]:
253259

254260
def _unary_response_context(self, base: str) -> list[str]:
255261
return [
256-
f"public struct {base}UnaryResponseContext<Response: Serializer> {{",
262+
(
263+
f"public struct {base}UnaryResponseContext<Response: Serializer>"
264+
" where Response.Target == Response {"
265+
),
257266
f" fileprivate let base: UnaryResponseCallContext<{base}Message<Response>>",
258267
" public var eventLoop: EventLoop { base.eventLoop }",
259268
" public func respond(_ response: Response) {",
@@ -265,7 +274,10 @@ def _unary_response_context(self, base: str) -> list[str]:
265274
def _async_response_stream(self, base: str) -> list[str]:
266275
return [
267276
_ASYNC_AVAILABLE,
268-
f"public struct {base}AsyncResponseStream<Response: Serializer> {{",
277+
(
278+
f"public struct {base}AsyncResponseStream<Response: Serializer>"
279+
" where Response.Target == Response {"
280+
),
269281
f" fileprivate let base: GRPCAsyncResponseStreamWriter<{base}Message<Response>>",
270282
" public func send(_ response: Response) async throws {",
271283
f" try await base.send({base}Message(response))",
@@ -276,7 +288,10 @@ def _async_response_stream(self, base: str) -> list[str]:
276288
def _async_request_stream(self, base: str) -> list[str]:
277289
return [
278290
_ASYNC_AVAILABLE,
279-
f"public struct {base}AsyncRequestStream<Request: Serializer>: AsyncSequence {{",
291+
(
292+
f"public struct {base}AsyncRequestStream<Request: Serializer>: AsyncSequence"
293+
" where Request.Target == Request {"
294+
),
280295
" public typealias Element = Request",
281296
f" fileprivate let base: GRPCAsyncRequestStream<{base}Message<Request>>",
282297
" public struct AsyncIterator: AsyncIteratorProtocol {",
@@ -294,7 +309,10 @@ def _async_request_stream(self, base: str) -> list[str]:
294309
def _client_response_stream(self, base: str) -> list[str]:
295310
return [
296311
_ASYNC_AVAILABLE,
297-
f"public struct {base}ResponseStream<Response: Serializer>: AsyncSequence {{",
312+
(
313+
f"public struct {base}ResponseStream<Response: Serializer>: AsyncSequence"
314+
" where Response.Target == Response {"
315+
),
298316
" public typealias Element = Response",
299317
f" fileprivate let base: GRPCAsyncResponseStream<{base}Message<Response>>",
300318
" public struct AsyncIterator: AsyncIteratorProtocol {",

0 commit comments

Comments
 (0)