Skip to content

Commit 1b39f58

Browse files
committed
Start async handlers as copy of sync handlers
1 parent 15aaec1 commit 1b39f58

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from dataclasses import dataclass
2+
from enum import IntEnum
3+
from typing import Optional
4+
5+
from temporalio import workflow
6+
7+
8+
class Language(IntEnum):
9+
CHINESE = 1
10+
ENGLISH = 2
11+
FRENCH = 3
12+
SPANISH = 4
13+
PORTUGUESE = 5
14+
15+
16+
@dataclass
17+
class GetLanguagesInput:
18+
include_unsupported: bool
19+
20+
21+
@dataclass
22+
class ApproveInput:
23+
name: str
24+
25+
26+
@workflow.defn
27+
class GreetingWorkflow:
28+
def __init__(self) -> None:
29+
self.approved_for_release = False
30+
self.approver_name: Optional[str] = None
31+
self.language = Language.ENGLISH
32+
self.greetings = {
33+
Language.ENGLISH: "Hello, world",
34+
Language.CHINESE: "你好,世界",
35+
}
36+
37+
@workflow.run
38+
async def run(self) -> str:
39+
await workflow.wait_condition(lambda: self.approved_for_release)
40+
return self.greetings[self.language]
41+
42+
@workflow.query
43+
def get_languages(self, input: GetLanguagesInput) -> list[Language]:
44+
# 👉 A Query handler returns a value: it can inspect but must not mutate the Workflow state.
45+
if input.include_unsupported:
46+
return list(Language)
47+
else:
48+
return list(self.greetings)
49+
50+
@workflow.signal
51+
def approve(self, input: ApproveInput) -> None:
52+
# 👉 A Signal handler mutates the Workflow state but cannot return a value.
53+
self.approved_for_release = True
54+
self.approver_name = input.name
55+
56+
@workflow.update
57+
def set_language(self, language: Language) -> Language:
58+
# 👉 An Update handler can mutate the Workflow state and return a value.
59+
previous_language, self.language = self.language, language
60+
return previous_language
61+
62+
@set_language.validator
63+
def validate_language(self, language: Language) -> None:
64+
if language not in self.greetings:
65+
# 👉 In an Update validator you raise any exception to reject the Update.
66+
raise ValueError(f"{language.name} is not supported")
67+
68+
@workflow.query
69+
def get_language(self) -> Language:
70+
return self.language

0 commit comments

Comments
 (0)