11import json
22import re
3- from typing import List , Optional , Union , Iterable
3+ from typing import List , Optional , Union , Iterable , Type
4+
5+ import betterproto
46
57from temporal .api .common .v1 import Payload , Payloads
68
@@ -30,10 +32,10 @@ def snake_to_title(snake_str):
3032METADATA_ENCODING_RAW = METADATA_ENCODING_RAW_NAME .encode ("utf-8" )
3133METADATA_ENCODING_JSON_NAME = "json/plain"
3234METADATA_ENCODING_JSON = METADATA_ENCODING_JSON_NAME .encode ("utf-8" )
33-
34- # TODO: Implement encode/decode for these:
3535METADATA_ENCODING_PROTOBUF_JSON_NAME = "json/protobuf"
3636METADATA_ENCODING_PROTOBUF_JSON = METADATA_ENCODING_PROTOBUF_JSON_NAME .encode ("utf-8" )
37+
38+ # TODO: Implement encode/decode for these:
3739METADATA_ENCODING_PROTOBUF_NAME = "binary/protobuf"
3840METADATA_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+
90106ENCODINGS = [
91107 encode_null ,
92108 encode_binary ,
109+ encode_protobuf_json ,
93110 encode_json_string
94111]
95112
96113
97114DECODINGS = {
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
0 commit comments