@@ -22,34 +22,70 @@ def check_output_type_annotation(cls, pytype) -> bool:
22
22
)
23
23
24
24
@classmethod
25
- def decode (cls , data : meta .Datum , * ,
26
- trigger_metadata ) -> _eventhub .EventHubEvent :
25
+ def decode (
26
+ cls , data : meta .Datum , * , trigger_metadata
27
+ ) -> typing .Union [_eventhub .EventHubEvent ,
28
+ typing .List [_eventhub .EventHubEvent ]]:
27
29
data_type = data .type
28
30
29
- if data_type == 'string' :
30
- body = data .value .encode ('utf-8' )
31
-
32
- elif data_type == 'bytes' :
33
- body = data .value
31
+ if (data_type == 'string' or data_type == 'bytes'
32
+ or data_type == 'json' ):
33
+ return cls .decode_single_event (data , trigger_metadata )
34
34
35
- elif data_type == 'json' :
36
- body = data .value .encode ('utf-8' )
35
+ elif (data_type == 'collection_bytes'
36
+ or data_type == 'collection_string' ):
37
+ return cls .decode_multiple_events (data , trigger_metadata )
37
38
38
39
else :
39
40
raise NotImplementedError (
40
41
f'unsupported event data payload type: { data_type } ' )
41
42
43
+ @classmethod
44
+ def decode_single_event (cls , data ,
45
+ trigger_metadata ) -> _eventhub .EventHubEvent :
46
+ if data .type == 'string' :
47
+ body = data .value .encode ('utf-8' )
48
+
49
+ elif data .type == 'bytes' :
50
+ body = data .value
51
+
52
+ elif data .type == 'json' :
53
+ body = data .value .encode ('utf-8' )
54
+
42
55
return _eventhub .EventHubEvent (body = body )
43
56
57
+ @classmethod
58
+ def decode_multiple_events (
59
+ cls , data , trigger_metadata
60
+ ) -> typing .List [_eventhub .EventHubEvent ]:
61
+ if data .type == 'collection_bytes' :
62
+ parsed_data = data .value .bytes
63
+
64
+ elif data .type == 'collection_string' :
65
+ parsed_data = data .value .string
66
+
67
+ events = []
68
+ for i in range (len (parsed_data )):
69
+ event = _eventhub .EventHubEvent (body = parsed_data [i ])
70
+ events .append (event )
71
+
72
+ return events
73
+
44
74
@classmethod
45
75
def encode (cls , obj : typing .Any , * ,
46
- expected_type : typing .Optional [type ]) -> meta .Datum :
76
+ expected_type : typing .Optional [type ]
77
+ ) -> meta .Datum :
78
+ data = meta .Datum (type = None , value = None )
79
+
47
80
if isinstance (obj , str ):
48
81
data = meta .Datum (type = 'string' , value = obj )
49
82
50
83
elif isinstance (obj , bytes ):
51
84
data = meta .Datum (type = 'bytes' , value = obj )
52
85
86
+ elif isinstance (obj , int ):
87
+ data = meta .Datum (type = 'int' , value = obj )
88
+
53
89
elif isinstance (obj , list ):
54
90
data = meta .Datum (type = 'json' , value = json .dumps (obj ))
55
91
@@ -58,25 +94,37 @@ def encode(cls, obj: typing.Any, *,
58
94
59
95
class EventHubTriggerConverter (EventHubConverter ,
60
96
binding = 'eventHubTrigger' , trigger = True ):
61
-
62
97
@classmethod
63
- def decode (cls , data : meta .Datum , * ,
64
- trigger_metadata ) -> _eventhub .EventHubEvent :
98
+ def decode (
99
+ cls , data : meta .Datum , * , trigger_metadata
100
+ ) -> typing .Union [_eventhub .EventHubEvent ,
101
+ typing .List [_eventhub .EventHubEvent ]]:
65
102
data_type = data .type
66
103
67
- if data_type == 'string' :
68
- body = data .value .encode ('utf-8' )
69
-
70
- elif data_type == 'bytes' :
71
- body = data .value
104
+ if (data_type == 'string' or data_type == 'bytes'
105
+ or data_type == 'json' ):
106
+ return cls .decode_single_event (data , trigger_metadata )
72
107
73
- elif data_type == 'json' :
74
- body = data .value .encode ('utf-8' )
108
+ elif (data_type == 'collection_bytes'
109
+ or data_type == 'collection_string' ):
110
+ return cls .decode_multiple_events (data , trigger_metadata )
75
111
76
112
else :
77
113
raise NotImplementedError (
78
114
f'unsupported event data payload type: { data_type } ' )
79
115
116
+ @classmethod
117
+ def decode_single_event (cls , data ,
118
+ trigger_metadata ) -> _eventhub .EventHubEvent :
119
+ if data .type == 'string' :
120
+ body = data .value .encode ('utf-8' )
121
+
122
+ elif data .type == 'bytes' :
123
+ body = data .value
124
+
125
+ elif data .type == 'json' :
126
+ body = data .value .encode ('utf-8' )
127
+
80
128
iothub_metadata = {}
81
129
for f in trigger_metadata :
82
130
if f .startswith ('iothub-' ):
@@ -96,3 +144,49 @@ def decode(cls, data: meta.Datum, *,
96
144
trigger_metadata , 'Offset' , python_type = str ),
97
145
iothub_metadata = iothub_metadata
98
146
)
147
+
148
+ @classmethod
149
+ def decode_multiple_events (
150
+ cls , data , trigger_metadata
151
+ ) -> typing .List [_eventhub .EventHubEvent ]:
152
+ if data .type == 'collection_bytes' :
153
+ parsed_data = data .value .bytes
154
+
155
+ elif data .type == 'collection_string' :
156
+ parsed_data = data .value .string
157
+
158
+ sys_props = trigger_metadata .get ('SystemPropertiesArray' )
159
+
160
+ parsed_sys_props = json .loads (sys_props .value )
161
+
162
+ if len (parsed_data ) != len (parsed_sys_props ):
163
+ raise AssertionError ('Number of bodies and metadata mismatched' )
164
+
165
+ events = []
166
+ for i in range (len (parsed_data )):
167
+ enqueued_time = parsed_sys_props [i ].get ('EnqueuedTimeUtc' )
168
+ partition_key = cls .encode (
169
+ parsed_sys_props [i ].get ('PartitionKey' ),
170
+ expected_type = str )
171
+ sequence_number = cls .encode (
172
+ parsed_sys_props [i ].get ('SequenceNumber' ),
173
+ expected_type = int )
174
+ offset = cls .encode (
175
+ parsed_sys_props [i ].get ('Offset' ),
176
+ expected_type = int )
177
+
178
+ event = _eventhub .EventHubEvent (
179
+ body = parsed_data [i ],
180
+ enqueued_time = cls ._parse_datetime (enqueued_time ),
181
+ partition_key = cls ._decode_typed_data (
182
+ partition_key , python_type = str ),
183
+ sequence_number = cls ._decode_typed_data (
184
+ sequence_number , python_type = int ),
185
+ offset = cls ._decode_typed_data (
186
+ offset , python_type = int ),
187
+ iothub_metadata = {}
188
+ )
189
+
190
+ events .append (event )
191
+
192
+ return events
0 commit comments