Skip to content
This repository was archived by the owner on Sep 18, 2023. It is now read-only.

Commit 8048216

Browse files
committed
Implemenet encode/decode for ProtobufJson
1 parent d79cac8 commit 8048216

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

temporal/conversions.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import json
22
import re
3-
from typing import List, Optional, Union, Iterable
3+
from typing import List, Optional, Union, Iterable, Type
4+
5+
import betterproto
46

57
from temporal.api.common.v1 import Payload, Payloads
68

@@ -30,10 +32,10 @@ def snake_to_title(snake_str):
3032
METADATA_ENCODING_RAW = METADATA_ENCODING_RAW_NAME.encode("utf-8")
3133
METADATA_ENCODING_JSON_NAME = "json/plain"
3234
METADATA_ENCODING_JSON = METADATA_ENCODING_JSON_NAME.encode("utf-8")
33-
34-
# TODO: Implement encode/decode for these:
3535
METADATA_ENCODING_PROTOBUF_JSON_NAME = "json/protobuf"
3636
METADATA_ENCODING_PROTOBUF_JSON = METADATA_ENCODING_PROTOBUF_JSON_NAME.encode("utf-8")
37+
38+
# TODO: Implement encode/decode for these:
3739
METADATA_ENCODING_PROTOBUF_NAME = "binary/protobuf"
3840
METADATA_ENCODING_PROTOBUF = METADATA_ENCODING_PROTOBUF_NAME.encode('utf-8')
3941

@@ -49,7 +51,7 @@ def encode_null(value: object) -> Optional[Payload]:
4951

5052

5153
# noinspection PyUnusedLocal
52-
def decode_null(payload: Payload) -> object:
54+
def decode_null(payload: Payload, type_hint) -> object:
5355
return None
5456

5557

@@ -63,7 +65,7 @@ def encode_binary(value: object) -> Optional[Payload]:
6365
return None
6466

6567

66-
def decode_binary(payload: Payload) -> object:
68+
def decode_binary(payload: Payload, type_hint) -> object:
6769
return payload.data
6870

6971

@@ -78,7 +80,7 @@ def encode_json_string(value: object) -> Payload:
7880
return p
7981

8082

81-
def decode_json_string(payload: Payload) -> object:
83+
def decode_json_string(payload: Payload, type_hint) -> object:
8284
# TODO:
8385
# mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
8486
# mapper.registerModule(new JavaTimeModule());
@@ -87,16 +89,32 @@ def decode_json_string(payload: Payload) -> object:
8789
return json.loads(b)
8890

8991

92+
def encode_protobuf_json(value: object) -> Payload:
93+
if not isinstance(value, betterproto.Message):
94+
return None
95+
p: Payload = Payload()
96+
p.metadata = {METADATA_ENCODING_KEY: METADATA_ENCODING_PROTOBUF_JSON}
97+
p.data = value.to_json().encode("utf-8")
98+
return p
99+
100+
101+
def decode_protobuf_json(payload: Payload, type_hint: Type[betterproto.Message]) -> betterproto.Message:
102+
b = str(payload.data, "utf-8")
103+
return type_hint().from_json(b)
104+
105+
90106
ENCODINGS = [
91107
encode_null,
92108
encode_binary,
109+
encode_protobuf_json,
93110
encode_json_string
94111
]
95112

96113

97114
DECODINGS = {
98115
METADATA_ENCODING_NULL: decode_null,
99116
METADATA_ENCODING_RAW: decode_binary,
117+
METADATA_ENCODING_PROTOBUF_JSON: decode_protobuf_json,
100118
METADATA_ENCODING_JSON: decode_json_string
101119
}
102120

temporal/converter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def from_payload(self, payload: Payload, type_hint: type = None) -> object:
6767
decoding = DECODINGS.get(encoding)
6868
if not decoding:
6969
raise Exception(f"Unsupported encoding: {str(encoding, 'utf-8')}")
70-
return decoding(payload)
70+
return decoding(payload, type_hint)
7171

7272

7373
DEFAULT_DATA_CONVERTER_INSTANCE = DefaultDataConverter()

0 commit comments

Comments
 (0)