Skip to content

Commit 3c0aa25

Browse files
committed
Update to use elif on oneof fields
1 parent bc1ad6a commit 3c0aa25

File tree

2 files changed

+67
-34
lines changed

2 files changed

+67
-34
lines changed

scripts/gen_visitors.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,25 @@ def walk(self, desc: Descriptor) -> bool:
113113
lines.append(" if self.skip_search_attributes:")
114114
lines.append(" return")
115115

116+
# Group fields by oneof to generate if/elif chains
117+
oneof_fields: dict[int, list[FieldDescriptor]] = {}
118+
regular_fields: list[FieldDescriptor] = []
119+
116120
for field in desc.fields:
117121
if field.type != FieldDescriptor.TYPE_MESSAGE:
118122
continue
123+
124+
# Skip synthetic oneofs (proto3 optional fields)
125+
if field.containing_oneof is not None:
126+
oneof_idx = field.containing_oneof.index
127+
if oneof_idx not in oneof_fields:
128+
oneof_fields[oneof_idx] = []
129+
oneof_fields[oneof_idx].append(field)
130+
else:
131+
regular_fields.append(field)
119132

133+
# Process regular fields first
134+
for field in regular_fields:
120135
# Repeated fields (including maps which are represented as repeated messages)
121136
if field.label == FieldDescriptor.LABEL_REPEATED:
122137
if (
@@ -174,6 +189,24 @@ def walk(self, desc: Descriptor) -> bool:
174189
)
175190
)
176191

192+
# Process oneof fields as if/elif chains
193+
for oneof_idx, fields in oneof_fields.items():
194+
oneof_lines = []
195+
first = True
196+
for field in fields:
197+
child_desc = field.message_type
198+
child_needed = self.walk(child_desc)
199+
needed |= child_needed
200+
if child_needed:
201+
if_word = "if" if first else "elif"
202+
first = False
203+
line = emit_singular(
204+
field.name, f"o.{field.name}", name_for(child_desc), True
205+
).replace(" if", f" {if_word}", 1)
206+
oneof_lines.append(line)
207+
if oneof_lines:
208+
lines.extend(oneof_lines)
209+
177210
self.generated[key] = needed
178211
self.in_progress.discard(key)
179212
if needed:

temporalio/bridge/_visitor.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ async def _visit_temporal_api_failure_v1_Failure(self, fs, o):
7373
await self._visit_temporal_api_failure_v1_ApplicationFailureInfo(
7474
fs, o.application_failure_info
7575
)
76-
if o.HasField("timeout_failure_info"):
76+
elif o.HasField("timeout_failure_info"):
7777
await self._visit_temporal_api_failure_v1_TimeoutFailureInfo(
7878
fs, o.timeout_failure_info
7979
)
80-
if o.HasField("canceled_failure_info"):
80+
elif o.HasField("canceled_failure_info"):
8181
await self._visit_temporal_api_failure_v1_CanceledFailureInfo(
8282
fs, o.canceled_failure_info
8383
)
84-
if o.HasField("reset_workflow_failure_info"):
84+
elif o.HasField("reset_workflow_failure_info"):
8585
await self._visit_temporal_api_failure_v1_ResetWorkflowFailureInfo(
8686
fs, o.reset_workflow_failure_info
8787
)
@@ -141,9 +141,9 @@ async def _visit_coresdk_activity_result_Cancellation(self, fs, o):
141141
async def _visit_coresdk_activity_result_ActivityResolution(self, fs, o):
142142
if o.HasField("completed"):
143143
await self._visit_coresdk_activity_result_Success(fs, o.completed)
144-
if o.HasField("failed"):
144+
elif o.HasField("failed"):
145145
await self._visit_coresdk_activity_result_Failure(fs, o.failed)
146-
if o.HasField("cancelled"):
146+
elif o.HasField("cancelled"):
147147
await self._visit_coresdk_activity_result_Cancellation(fs, o.cancelled)
148148

149149
async def _visit_coresdk_workflow_activation_ResolveActivity(self, fs, o):
@@ -179,9 +179,9 @@ async def _visit_coresdk_child_workflow_Cancellation(self, fs, o):
179179
async def _visit_coresdk_child_workflow_ChildWorkflowResult(self, fs, o):
180180
if o.HasField("completed"):
181181
await self._visit_coresdk_child_workflow_Success(fs, o.completed)
182-
if o.HasField("failed"):
182+
elif o.HasField("failed"):
183183
await self._visit_coresdk_child_workflow_Failure(fs, o.failed)
184-
if o.HasField("cancelled"):
184+
elif o.HasField("cancelled"):
185185
await self._visit_coresdk_child_workflow_Cancellation(fs, o.cancelled)
186186

187187
async def _visit_coresdk_workflow_activation_ResolveChildWorkflowExecution(
@@ -217,11 +217,11 @@ async def _visit_coresdk_workflow_activation_ResolveNexusOperationStart(
217217
async def _visit_coresdk_nexus_NexusOperationResult(self, fs, o):
218218
if o.HasField("completed"):
219219
await self._visit_temporal_api_common_v1_Payload(fs, o.completed)
220-
if o.HasField("failed"):
220+
elif o.HasField("failed"):
221221
await self._visit_temporal_api_failure_v1_Failure(fs, o.failed)
222-
if o.HasField("cancelled"):
222+
elif o.HasField("cancelled"):
223223
await self._visit_temporal_api_failure_v1_Failure(fs, o.cancelled)
224-
if o.HasField("timed_out"):
224+
elif o.HasField("timed_out"):
225225
await self._visit_temporal_api_failure_v1_Failure(fs, o.timed_out)
226226

227227
async def _visit_coresdk_workflow_activation_ResolveNexusOperation(self, fs, o):
@@ -233,41 +233,41 @@ async def _visit_coresdk_workflow_activation_WorkflowActivationJob(self, fs, o):
233233
await self._visit_coresdk_workflow_activation_InitializeWorkflow(
234234
fs, o.initialize_workflow
235235
)
236-
if o.HasField("query_workflow"):
236+
elif o.HasField("query_workflow"):
237237
await self._visit_coresdk_workflow_activation_QueryWorkflow(
238238
fs, o.query_workflow
239239
)
240-
if o.HasField("signal_workflow"):
240+
elif o.HasField("signal_workflow"):
241241
await self._visit_coresdk_workflow_activation_SignalWorkflow(
242242
fs, o.signal_workflow
243243
)
244-
if o.HasField("resolve_activity"):
244+
elif o.HasField("resolve_activity"):
245245
await self._visit_coresdk_workflow_activation_ResolveActivity(
246246
fs, o.resolve_activity
247247
)
248-
if o.HasField("resolve_child_workflow_execution_start"):
248+
elif o.HasField("resolve_child_workflow_execution_start"):
249249
await self._visit_coresdk_workflow_activation_ResolveChildWorkflowExecutionStart(
250250
fs, o.resolve_child_workflow_execution_start
251251
)
252-
if o.HasField("resolve_child_workflow_execution"):
252+
elif o.HasField("resolve_child_workflow_execution"):
253253
await self._visit_coresdk_workflow_activation_ResolveChildWorkflowExecution(
254254
fs, o.resolve_child_workflow_execution
255255
)
256-
if o.HasField("resolve_signal_external_workflow"):
256+
elif o.HasField("resolve_signal_external_workflow"):
257257
await self._visit_coresdk_workflow_activation_ResolveSignalExternalWorkflow(
258258
fs, o.resolve_signal_external_workflow
259259
)
260-
if o.HasField("resolve_request_cancel_external_workflow"):
260+
elif o.HasField("resolve_request_cancel_external_workflow"):
261261
await self._visit_coresdk_workflow_activation_ResolveRequestCancelExternalWorkflow(
262262
fs, o.resolve_request_cancel_external_workflow
263263
)
264-
if o.HasField("do_update"):
264+
elif o.HasField("do_update"):
265265
await self._visit_coresdk_workflow_activation_DoUpdate(fs, o.do_update)
266-
if o.HasField("resolve_nexus_operation_start"):
266+
elif o.HasField("resolve_nexus_operation_start"):
267267
await self._visit_coresdk_workflow_activation_ResolveNexusOperationStart(
268268
fs, o.resolve_nexus_operation_start
269269
)
270-
if o.HasField("resolve_nexus_operation"):
270+
elif o.HasField("resolve_nexus_operation"):
271271
await self._visit_coresdk_workflow_activation_ResolveNexusOperation(
272272
fs, o.resolve_nexus_operation
273273
)
@@ -295,7 +295,7 @@ async def _visit_coresdk_workflow_commands_QuerySuccess(self, fs, o):
295295
async def _visit_coresdk_workflow_commands_QueryResult(self, fs, o):
296296
if o.HasField("succeeded"):
297297
await self._visit_coresdk_workflow_commands_QuerySuccess(fs, o.succeeded)
298-
if o.HasField("failed"):
298+
elif o.HasField("failed"):
299299
await self._visit_temporal_api_failure_v1_Failure(fs, o.failed)
300300

301301
async def _visit_coresdk_workflow_commands_CompleteWorkflowExecution(self, fs, o):
@@ -355,7 +355,7 @@ async def _visit_coresdk_workflow_commands_ModifyWorkflowProperties(self, fs, o)
355355
async def _visit_coresdk_workflow_commands_UpdateResponse(self, fs, o):
356356
if o.HasField("rejected"):
357357
await self._visit_temporal_api_failure_v1_Failure(fs, o.rejected)
358-
if o.HasField("completed"):
358+
elif o.HasField("completed"):
359359
await self._visit_temporal_api_common_v1_Payload(fs, o.completed)
360360

361361
async def _visit_coresdk_workflow_commands_ScheduleNexusOperation(self, fs, o):
@@ -369,47 +369,47 @@ async def _visit_coresdk_workflow_commands_WorkflowCommand(self, fs, o):
369369
await self._visit_coresdk_workflow_commands_ScheduleActivity(
370370
fs, o.schedule_activity
371371
)
372-
if o.HasField("respond_to_query"):
372+
elif o.HasField("respond_to_query"):
373373
await self._visit_coresdk_workflow_commands_QueryResult(
374374
fs, o.respond_to_query
375375
)
376-
if o.HasField("complete_workflow_execution"):
376+
elif o.HasField("complete_workflow_execution"):
377377
await self._visit_coresdk_workflow_commands_CompleteWorkflowExecution(
378378
fs, o.complete_workflow_execution
379379
)
380-
if o.HasField("fail_workflow_execution"):
380+
elif o.HasField("fail_workflow_execution"):
381381
await self._visit_coresdk_workflow_commands_FailWorkflowExecution(
382382
fs, o.fail_workflow_execution
383383
)
384-
if o.HasField("continue_as_new_workflow_execution"):
384+
elif o.HasField("continue_as_new_workflow_execution"):
385385
await self._visit_coresdk_workflow_commands_ContinueAsNewWorkflowExecution(
386386
fs, o.continue_as_new_workflow_execution
387387
)
388-
if o.HasField("start_child_workflow_execution"):
388+
elif o.HasField("start_child_workflow_execution"):
389389
await self._visit_coresdk_workflow_commands_StartChildWorkflowExecution(
390390
fs, o.start_child_workflow_execution
391391
)
392-
if o.HasField("signal_external_workflow_execution"):
392+
elif o.HasField("signal_external_workflow_execution"):
393393
await self._visit_coresdk_workflow_commands_SignalExternalWorkflowExecution(
394394
fs, o.signal_external_workflow_execution
395395
)
396-
if o.HasField("schedule_local_activity"):
396+
elif o.HasField("schedule_local_activity"):
397397
await self._visit_coresdk_workflow_commands_ScheduleLocalActivity(
398398
fs, o.schedule_local_activity
399399
)
400-
if o.HasField("upsert_workflow_search_attributes"):
400+
elif o.HasField("upsert_workflow_search_attributes"):
401401
await self._visit_coresdk_workflow_commands_UpsertWorkflowSearchAttributes(
402402
fs, o.upsert_workflow_search_attributes
403403
)
404-
if o.HasField("modify_workflow_properties"):
404+
elif o.HasField("modify_workflow_properties"):
405405
await self._visit_coresdk_workflow_commands_ModifyWorkflowProperties(
406406
fs, o.modify_workflow_properties
407407
)
408-
if o.HasField("update_response"):
408+
elif o.HasField("update_response"):
409409
await self._visit_coresdk_workflow_commands_UpdateResponse(
410410
fs, o.update_response
411411
)
412-
if o.HasField("schedule_nexus_operation"):
412+
elif o.HasField("schedule_nexus_operation"):
413413
await self._visit_coresdk_workflow_commands_ScheduleNexusOperation(
414414
fs, o.schedule_nexus_operation
415415
)
@@ -427,5 +427,5 @@ async def _visit_coresdk_workflow_completion_WorkflowActivationCompletion(
427427
):
428428
if o.HasField("successful"):
429429
await self._visit_coresdk_workflow_completion_Success(fs, o.successful)
430-
if o.HasField("failed"):
430+
elif o.HasField("failed"):
431431
await self._visit_coresdk_workflow_completion_Failure(fs, o.failed)

0 commit comments

Comments
 (0)