Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions advanced/samples/dotnet/wit/user-service/Models.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@
namespace Nexgen.UserService
{

[GeneratedCode("nexgen", null)]
public record GetProfileRequest
{
/// <summary>
/// Initializes a new instance of the <see cref="GetProfileRequest"/> class.
/// </summary>
public GetProfileRequest(string userId)
{
UserId = userId;
}

public string UserId { get; init; }
}

[GeneratedCode("nexgen", null)]
public record GetUserRequest
{
Expand Down Expand Up @@ -58,4 +72,18 @@ public UpdateEmailRequest(string userId, string email)
public string Email { get; init; }
}

[GeneratedCode("nexgen", null)]
public record UserProfile
{
/// <summary>
/// Initializes a new instance of the <see cref="UserProfile"/> class.
/// </summary>
public UserProfile(string displayName)
{
DisplayName = displayName;
}

public string DisplayName { get; init; }
}

}
8 changes: 8 additions & 0 deletions advanced/samples/dotnet/wit/user-service/Resources.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ public async Task NotifyAsync(string? reason, IReadOnlyList<string> channels, st
await RequireNexgenClient().ExecuteNexusOperationAsync(svc => svc.Notify(request)).ConfigureAwait(true);
}

[GeneratedCode("nexgen", null)]
public async Task<UserProfile> GetProfileAsync()
{
var request = new GetProfileRequest(UserId);
var result = await RequireNexgenClient().ExecuteNexusOperationAsync<UserProfile>(svc => svc.GetProfile(request)).ConfigureAwait(true);
return result;
}

}

}
33 changes: 33 additions & 0 deletions advanced/samples/dotnet/wit/user-service/Services.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ internal interface IUserService
[NexusOperation("Notify")]
void Notify(NotifyRequest request);

[GeneratedCode("nexgen", null)]
[NexusOperation("GetProfile")]
UserProfile GetProfile(GetProfileRequest request);

}

[GeneratedCode("nexgen", null)]
Expand Down Expand Up @@ -80,6 +84,20 @@ public NotifyOptions(string userId, IReadOnlyList<string> channels, string sende
public string Sender { get; set; }
}

[GeneratedCode("nexgen", null)]
public class GetProfileOptions
{
/// <summary>
/// Initializes a new instance of the <see cref="GetProfileOptions"/> class.
/// </summary>
public GetProfileOptions(string userId)
{
UserId = userId;
}

public string UserId { get; set; }
}

[GeneratedCode("nexgen", null)]
public class UserServiceClient
{
Expand Down Expand Up @@ -137,6 +155,21 @@ public Task NotifyAsync(NotifyOptions options)
return NotifyAsync(request);
}

[GeneratedCode("nexgen", null)]
private async Task<UserProfile> GetProfileAsync(GetProfileRequest request)
{
var result = await _client.ExecuteNexusOperationAsync<UserProfile>(svc => svc.GetProfile(request)).ConfigureAwait(true);
return result;
}

/// <param name="options">Options for the operation.</param>
[GeneratedCode("nexgen", null)]
public Task<UserProfile> GetProfileAsync(GetProfileOptions options)
{
var request = new GetProfileRequest(options.UserId);
return GetProfileAsync(request);
}

}

}
38 changes: 38 additions & 0 deletions advanced/samples/go/userservice/userservice.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions advanced/samples/inputs/user-service.wit
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ interface user-service {

update-email: func(email: string) -> user-result;
notify: func(reason: option<string>, channels: list<string>, sender: string);
get-profile: func() -> user-profile;
}

type user-result = own<user>;
Expand All @@ -30,7 +31,16 @@ interface user-service {
sender: string,
}

record get-profile-request {
user-id: string,
}

record user-profile {
display-name: string,
}

get-user: func(request: get-user-request) -> user-result;
update-email: func(request: update-email-request) -> user-result;
notify: func(request: notify-request);
get-profile: func(request: get-profile-request) -> user-profile;
}
19 changes: 17 additions & 2 deletions advanced/samples/python/tests/test_user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,15 @@ async def notify(
) -> None:
self.calls.append(("Notify", input))

@sync_operation
async def get_profile(
self,
_ctx: StartOperationContext,
input: user_service_models.GetProfileRequest,
) -> user_service_models.UserProfile:
self.calls.append(("GetProfile", input))
return user_service_models.UserProfile(display_name="Alice")


@workflow.defn
class UserServiceCallerWorkflow:
Expand All @@ -79,6 +88,7 @@ async def run(self) -> User:
service = user_service.UserServiceClient("user-service")
user = await service.get_user(user_id="user-123")
await user.notify(sender="ops")
assert (await user.get_profile()).display_name == "Alice"
return await user.update_email("new@example.com")


Expand Down Expand Up @@ -126,7 +136,7 @@ async def test_get_user_returns_user_resource(env: WorkflowEnvironment) -> None:
assert user.user_id == "user-123"
assert user.email == "new@example.com"

assert len(service_handler.calls) == 3
assert len(service_handler.calls) == 4
get_user_operation, get_user_request = service_handler.calls[0]
assert get_user_operation == "GetUser"
assert isinstance(get_user_request, user_service_models.GetUserRequest)
Expand All @@ -138,7 +148,12 @@ async def test_get_user_returns_user_resource(env: WorkflowEnvironment) -> None:
user_id="user-123", reason=None, channels=[], sender="ops"
)

update_operation, update_request = service_handler.calls[2]
assert service_handler.calls[2] == (
"GetProfile",
user_service_models.GetProfileRequest(user_id="user-123"),
)

update_operation, update_request = service_handler.calls[3]
assert update_operation == "UpdateEmail"
assert isinstance(update_request, user_service_models.UpdateEmailRequest)
assert update_request.user_id == "user-123"
Expand Down
6 changes: 6 additions & 0 deletions advanced/samples/python/wit/user_service/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,10 @@ def __init__(
): _NexusOperationInfo(
operation=_services.UserService.notify,
),
(
"UserService",
"GetProfile",
): _NexusOperationInfo(
operation=_services.UserService.get_profile,
),
}
16 changes: 16 additions & 0 deletions advanced/samples/python/wit/user_service/_resources/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import typing

from ..models import (
GetProfileRequest,
NotifyRequest,
UpdateEmailRequest,
UserProfile,
)


Expand Down Expand Up @@ -56,6 +58,20 @@ async def notify(
)
await handle

async def get_profile(
self,
) -> UserProfile:
request = GetProfileRequest(
user_id=self.user_id,
)
nexus_client = getattr(self, "_nexus_client")
handle = await nexus_client.start_operation(
operation="GetProfile",
input=request,
output_type=UserProfile,
)
return await handle


def bind_user_client(
resource: User,
Expand Down
10 changes: 10 additions & 0 deletions advanced/samples/python/wit/user_service/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,13 @@ class NotifyRequest:
reason: str | None = None
channels: list[str] | None = dataclasses.field(default_factory=list)
sender: str


@dataclasses.dataclass(slots=True)
class GetProfileRequest:
user_id: str


@dataclasses.dataclass(slots=True)
class UserProfile:
display_name: str
21 changes: 21 additions & 0 deletions advanced/samples/python/wit/user_service/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import temporalio.workflow

from .models import (
GetProfileRequest,
GetUserRequest,
NotifyRequest,
UpdateEmailRequest,
UserProfile,
)
from ._resources.user import (
User,
Expand Down Expand Up @@ -37,6 +39,11 @@ class UserService:
None,
] = Operation(name="Notify")

get_profile: Operation[
GetProfileRequest,
UserProfile,
] = Operation(name="GetProfile")


class UserServiceClient:
def __init__(self, endpoint: str) -> None:
Expand Down Expand Up @@ -97,3 +104,17 @@ async def notify(
operation="Notify",
input=request,
)

async def get_profile(
self,
*,
user_id: str,
) -> temporalio.workflow.NexusOperationHandle[UserProfile]:
request = GetProfileRequest(
user_id=user_id,
)
return await self._nexus_client.start_operation(
operation="GetProfile",
input=request,
output_type=UserProfile,
)
3 changes: 3 additions & 0 deletions advanced/samples/typescript/tests/user-service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ describe("user-service generated output", () => {
return new User(input.userId, input.email);
},
async notify() {},
async getProfile() {
return { displayName: "Alice" };
},
});

const result = await executeWorkflowWithNexus<{
Expand Down
8 changes: 7 additions & 1 deletion advanced/samples/typescript/wit/user-service/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
// Generated by nexgen latest. DO NOT EDIT!

export { userService, UserServiceClient } from "./services";
export type { GetUserRequest, NotifyRequest, UpdateEmailRequest } from "./models";
export type {
GetProfileRequest,
GetUserRequest,
NotifyRequest,
UpdateEmailRequest,
UserProfile,
} from "./models";
8 changes: 8 additions & 0 deletions advanced/samples/typescript/wit/user-service/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,11 @@ export interface NotifyRequest {
channels?: string[];
sender: string;
}

export interface UserProfile {
displayName: string;
}

export interface GetProfileRequest {
userId: string;
}
Loading
Loading