11import asyncio
2- import dataclasses
3- from typing import Any , Optional , Type
42
5- import temporalio .converter
6- from temporalio import workflow
7- from temporalio .api .common .v1 import Payload
83from temporalio .client import Client
9- from temporalio .converter import (
10- CompositePayloadConverter ,
11- DefaultPayloadConverter ,
12- EncodingPayloadConverter ,
13- )
144from temporalio .worker import Worker
155
16-
17- class GreetingInput :
18- def __init__ (self , name : str ) -> None :
19- self .name = name
20-
21-
22- class GreetingOutput :
23- def __init__ (self , result : str ) -> None :
24- self .result = result
25-
26-
27- @workflow .defn
28- class GreetingWorkflow :
29- @workflow .run
30- async def run (self , input : GreetingInput ) -> GreetingOutput :
31- return GreetingOutput (f"Hello, { input .name } " )
32-
33-
34- class GreetingEncodingPayloadConverter (EncodingPayloadConverter ):
35- @property
36- def encoding (self ) -> str :
37- return "text/my-greeting-encoding"
38-
39- def to_payload (self , value : Any ) -> Optional [Payload ]:
40- if isinstance (value , GreetingInput ):
41- return Payload (
42- metadata = {"encoding" : self .encoding .encode (), "is_input" : b"true" },
43- data = value .name .encode (),
44- )
45- elif isinstance (value , GreetingOutput ):
46- return Payload (
47- metadata = {"encoding" : self .encoding .encode ()},
48- data = value .result .encode (),
49- )
50- else :
51- return None
52-
53- def from_payload (self , payload : Payload , type_hint : Optional [Type ] = None ) -> Any :
54- if payload .metadata .get ("is_input" ) == b"true" :
55- # Confirm proper type hint if present
56- assert not type_hint or type_hint is GreetingInput
57- return GreetingInput (payload .data .decode ())
58- else :
59- assert not type_hint or type_hint is GreetingOutput
60- return GreetingOutput (payload .data .decode ())
61-
62-
63- class GreetingPayloadConverter (CompositePayloadConverter ):
64- def __init__ (self ) -> None :
65- # Just add ours as first before the defaults
66- super ().__init__ (
67- GreetingEncodingPayloadConverter (),
68- # TODO(cretz): Make this list available without instantiation - https://github.com/temporalio/sdk-python/issues/139
69- * DefaultPayloadConverter ().converters .values (),
70- )
71-
6+ from custom_converter .shared import greeting_data_converter
7+ from custom_converter .workflow import GreetingWorkflow
728
739interrupt_event = asyncio .Event ()
7410
@@ -77,13 +13,9 @@ async def main():
7713 # Connect client
7814 client = await Client .connect (
7915 "localhost:7233" ,
80- # Use the default data converter, but change the payload converter.
8116 # Without this, when trying to run a workflow, we get:
8217 # KeyError: 'Unknown payload encoding my-greeting-encoding
83- data_converter = dataclasses .replace (
84- temporalio .converter .default (),
85- payload_converter_class = GreetingPayloadConverter ,
86- ),
18+ data_converter = greeting_data_converter ,
8719 )
8820
8921 # Run a worker for the workflow
0 commit comments