Skip to content

Commit 923efaf

Browse files
authored
Add .NET system Nexus serialization context (#860)
## Summary - Add the .NET serialization-context factory annotation for the Signal-with-Start System Nexus operation. - Add .NET from-proto conversion metadata for native Temporal model types. - Represent the two workflow-ID policy fields as proto-backed aliases and add the native failure type. These annotations let nexgen generate the operation metadata and native .NET conversions needed by the SDK. ## Validation - `git diff --check` - `cargo build-examples --lang dotnet` (nexgen example regeneration)
1 parent 56f6aa1 commit 923efaf

2 files changed

Lines changed: 26 additions & 15 deletions

File tree

‎nexus/deps/nexus-temporal-types/model.wit‎

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,28 @@ interface model {
99
/// python="typing.Any"
1010
/// typescript="common.Payload"
1111
/// dotnet="object?"
12+
/// dotnet-from="ProtoExtensions.FromPayload"
1213
/// dotnet-to="ProtoExtensions.ToPayload"
1314
/// typescript-import="@temporalio/common"
1415
type payload = placeholder;
1516

1617
/// @nexus.proto "temporal.api.common.v1.Payloads"
1718
/// typescript-import="@temporalio/proto"
18-
/// @nexus.type dotnet="IReadOnlyCollection<object?>" dotnet-to="ProtoExtensions.ToPayloads"
19+
/// @nexus.type dotnet="IReadOnlyCollection<object?>" dotnet-from="ProtoExtensions.FromPayloads" dotnet-to="ProtoExtensions.ToPayloads"
1920
type payloads = list<payload>;
2021

22+
/// Temporal failure represented by the target SDK's native exception/error type.
23+
/// The SDK failure converter owns the recursive cause and failure-info structure.
24+
/// @nexus.proto "temporal.api.failure.v1.Failure" typescript-import="@temporalio/proto"
25+
/// @nexus.type
26+
/// python="BaseException"
27+
/// typescript="Error"
28+
/// go="error"
29+
/// dotnet="System.Exception"
30+
/// dotnet-from="ProtoExtensions.FromFailureProto"
31+
/// dotnet-to="ProtoExtensions.ToFailureProto"
32+
type failure = placeholder;
33+
2134
/// Callable result annotation for workflow functions.
2235
/// @nexus.type
2336
/// python="collections.abc.Awaitable[WorkflowResult]"
@@ -50,6 +63,7 @@ interface model {
5063
/// python="str"
5164
/// typescript="string"
5265
/// dotnet="string"
66+
/// dotnet-from="ProtoExtensions.FromWorkflowTypeProto"
5367
/// dotnet-to="ProtoExtensions.ToWorkflowTypeProto"
5468
type workflow-type = placeholder;
5569

@@ -83,6 +97,7 @@ interface model {
8397
/// python="temporalio.common.RetryPolicy"
8498
/// typescript="common.RetryPolicy"
8599
/// dotnet="Temporalio.Common.RetryPolicy"
100+
/// dotnet-from="ProtoExtensions.FromRetryPolicyProto"
86101
/// typescript-import="@temporalio/common"
87102
type retry-policy = placeholder;
88103

@@ -91,11 +106,12 @@ interface model {
91106
/// python="str"
92107
/// typescript="string"
93108
/// dotnet="string"
109+
/// dotnet-from="ProtoExtensions.FromTaskQueueProto"
94110
/// dotnet-to="ProtoExtensions.ToTaskQueueProto"
95111
type task-queue = placeholder;
96112

97113
/// @nexus.proto "temporal.api.common.v1.Memo" typescript-import="@temporalio/proto"
98-
/// @nexus.type python="collections.abc.Mapping[str, typing.Any]" typescript="Record<string, unknown>" dotnet="IReadOnlyDictionary<string, object?>"
114+
/// @nexus.type python="collections.abc.Mapping[str, typing.Any]" typescript="Record<string, unknown>" dotnet="IReadOnlyDictionary<string, object?>" dotnet-from="ProtoExtensions.FromMemoProto"
99115
type memo = placeholder;
100116

101117
/// @nexus.proto "temporal.api.common.v1.Header" typescript-import="@temporalio/proto"
@@ -114,6 +130,7 @@ interface model {
114130
/// python="temporalio.common.TypedSearchAttributes"
115131
/// typescript="common.TypedSearchAttributes"
116132
/// dotnet="Temporalio.Common.SearchAttributeCollection"
133+
/// dotnet-from="ProtoExtensions.FromSearchAttributesProto"
117134
/// typescript-import="@temporalio/common"
118135
type search-attributes = placeholder;
119136

@@ -122,6 +139,7 @@ interface model {
122139
/// python="temporalio.common.Priority"
123140
/// typescript="common.Priority"
124141
/// dotnet="Temporalio.Common.Priority"
142+
/// dotnet-from="ProtoExtensions.FromPriorityProto"
125143
/// typescript-import="@temporalio/common"
126144
type priority = placeholder;
127145

@@ -130,6 +148,7 @@ interface model {
130148
/// python="temporalio.common.VersioningOverride"
131149
/// typescript="common.VersioningOverride"
132150
/// dotnet="Temporalio.Common.VersioningOverride"
151+
/// dotnet-from="ProtoExtensions.FromVersioningOverrideProto"
133152
/// typescript-import="@temporalio/common"
134153
type versioning-override = placeholder;
135154

@@ -138,6 +157,7 @@ interface model {
138157
/// python="datetime.timedelta"
139158
/// typescript="common.Duration"
140159
/// dotnet="System.TimeSpan"
160+
/// dotnet-from="ProtoExtensions.FromDurationProto"
141161
/// typescript-import="@temporalio/common"
142162
type duration = placeholder;
143163

@@ -147,24 +167,15 @@ interface model {
147167
/// typescript="common.WorkflowIdReusePolicy"
148168
/// dotnet="Temporalio.Api.Enums.V1.WorkflowIdReusePolicy"
149169
/// typescript-import="@temporalio/common"
150-
enum workflow-id-reuse-policy {
151-
allow-duplicate,
152-
allow-duplicate-failed-only,
153-
reject-duplicate,
154-
terminate-if-running,
155-
}
170+
type workflow-id-reuse-policy = placeholder;
156171

157172
/// @nexus.proto "temporal.api.enums.v1.WorkflowIdConflictPolicy" typescript-import="@temporalio/proto"
158173
/// @nexus.type
159174
/// python="temporalio.common.WorkflowIDConflictPolicy"
160175
/// typescript="common.WorkflowIdConflictPolicy"
161176
/// dotnet="Temporalio.Api.Enums.V1.WorkflowIdConflictPolicy"
162177
/// typescript-import="@temporalio/common"
163-
enum workflow-id-conflict-policy {
164-
fail,
165-
use-existing,
166-
terminate-existing,
167-
}
178+
type workflow-id-conflict-policy = placeholder;
168179

169180
/// @nexus.proto "temporal.api.sdk.v1.UserMetadata" typescript-import="@temporalio/proto"
170181
/// @nexus.flatten-in-api

‎nexus/workflow-service.wit‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ interface workflow-service {
8686
/// @nexus.proto-field "workflow_start_delay"
8787
start-delay: option<duration>,
8888
user-metadata: option<user-metadata>,
89-
/// @nexus.source python="workflow_namespace" typescript="workflowNamespace" dotnet="TemporalWorkflowContext.WorkflowNamespace"
89+
/// @nexus.source python="workflow_namespace()" typescript="workflowNamespace()" go="workflow.GetInfo(ctx).Namespace" dotnet="TemporalWorkflowContext.WorkflowNamespace()"
9090
namespace: string,
9191
/// @nexus.omit
9292
control: placeholder,
@@ -122,7 +122,7 @@ interface workflow-service {
122122
/// dotnet-type="Temporalio.Workflows.ExternalWorkflowHandle"
123123
/// dotnet="Temporalio.Workflows.Workflow.GetExternalWorkflowHandle(request.Id, result.RunId)"
124124
/// @nexus.operation name="SignalWithStartWorkflowExecution"
125-
/// @nexus.serialization-context python="signal_with_start_workflow_serialization_context"
125+
/// @nexus.serialization-context python="signal_with_start_workflow_serialization_context" dotnet="WorkflowServiceSerializationContexts.SignalWithStartWorkflow"
126126
/// @nexus.experimental
127127
signal-with-start-workflow: func(
128128
request: signal-with-start-workflow-request,

0 commit comments

Comments
 (0)