@@ -5,90 +5,59 @@ use cloudevents::message::{
5
5
Result , StructuredDeserializer , StructuredSerializer ,
6
6
} ;
7
7
use cloudevents:: { message, Event } ;
8
- use paho_mqtt:: { Message , PropertyCode } ;
9
- use std:: collections:: HashMap ;
8
+ use paho_mqtt:: { Message , Properties , PropertyCode } ;
10
9
use std:: convert:: TryFrom ;
11
- use std:: str;
12
10
13
- pub struct ConsumerMessageDeserializer {
14
- pub ( crate ) headers : HashMap < String , Vec < u8 > > ,
11
+ pub struct ConsumerMessageDeserializer < ' a > {
12
+ pub ( crate ) headers : & ' a Properties ,
15
13
pub ( crate ) payload : Option < Vec < u8 > > ,
16
14
}
17
15
18
- impl ConsumerMessageDeserializer {
19
- fn get_mqtt_headers ( message : & Message ) -> Result < HashMap < String , Vec < u8 > > > {
20
- let mut hm = HashMap :: new ( ) ;
21
- let prop_iterator = message. properties ( ) . iter ( PropertyCode :: UserProperty ) ;
22
-
23
- for property in prop_iterator {
24
- let header = property. get_string_pair ( ) . unwrap ( ) ;
25
- hm. insert ( header. 0 . to_string ( ) , Vec :: from ( header. 1 ) ) ;
26
- }
27
-
28
- Ok ( hm)
16
+ impl < ' a > ConsumerMessageDeserializer < ' a > {
17
+ fn get_mqtt_headers ( message : & Message ) -> & Properties {
18
+ message. properties ( )
29
19
}
30
20
31
21
pub fn new ( message : & Message ) -> Result < ConsumerMessageDeserializer > {
32
22
Ok ( ConsumerMessageDeserializer {
33
- headers : Self :: get_mqtt_headers ( message) ? ,
23
+ headers : Self :: get_mqtt_headers ( message) ,
34
24
payload : Some ( message. payload ( ) ) . map ( |s| Vec :: from ( s) ) ,
35
25
} )
36
26
}
37
27
}
38
28
39
- impl BinaryDeserializer for ConsumerMessageDeserializer {
40
- fn deserialize_binary < R : Sized , V : BinarySerializer < R > > ( mut self , mut visitor : V ) -> Result < R > {
29
+ impl < ' a > BinaryDeserializer for ConsumerMessageDeserializer < ' a > {
30
+ fn deserialize_binary < R : Sized , V : BinarySerializer < R > > ( self , mut visitor : V ) -> Result < R > {
41
31
if self . encoding ( ) != Encoding :: BINARY {
42
32
return Err ( message:: Error :: WrongEncoding { } ) ;
43
33
}
44
34
45
35
let spec_version = SpecVersion :: try_from (
46
- str :: from_utf8 ( & self . headers . remove ( headers :: SPEC_VERSION_HEADER ) . unwrap ( ) [ .. ] )
47
- . map_err ( |e| cloudevents :: message :: Error :: Other {
48
- source : Box :: new ( e ) ,
49
- } ) ? ,
36
+ self . headers
37
+ . find_user_property ( headers :: SPEC_VERSION_HEADER )
38
+ . unwrap ( )
39
+ . as_str ( ) ,
50
40
) ?;
51
41
52
42
visitor = visitor. set_spec_version ( spec_version. clone ( ) ) ?;
53
43
54
44
let attributes = spec_version. attribute_names ( ) ;
55
45
56
- if let Some ( hv) = self . headers . remove ( headers:: CONTENT_TYPE ) {
57
- visitor = visitor. set_attribute (
58
- "datacontenttype" ,
59
- MessageAttributeValue :: String ( String :: from_utf8 ( hv) . map_err ( |e| {
60
- cloudevents:: message:: Error :: Other {
61
- source : Box :: new ( e) ,
62
- }
63
- } ) ?) ,
64
- ) ?
46
+ if let Some ( hv) = self . headers . find_user_property ( headers:: CONTENT_TYPE ) {
47
+ visitor = visitor. set_attribute ( "datacontenttype" , MessageAttributeValue :: String ( hv) ) ?
65
48
}
66
49
67
50
for ( hn, hv) in self
68
51
. headers
69
- . into_iter ( )
52
+ . user_iter ( )
70
53
. filter ( |( hn, _) | headers:: SPEC_VERSION_HEADER != * hn && hn. starts_with ( "ce_" ) )
71
54
{
72
55
let name = & hn[ "ce_" . len ( ) ..] ;
73
56
74
57
if attributes. contains ( & name) {
75
- visitor = visitor. set_attribute (
76
- name,
77
- MessageAttributeValue :: String ( String :: from_utf8 ( hv) . map_err ( |e| {
78
- cloudevents:: message:: Error :: Other {
79
- source : Box :: new ( e) ,
80
- }
81
- } ) ?) ,
82
- ) ?
58
+ visitor = visitor. set_attribute ( name, MessageAttributeValue :: String ( hv) ) ?
83
59
} else {
84
- visitor = visitor. set_extension (
85
- name,
86
- MessageAttributeValue :: String ( String :: from_utf8 ( hv) . map_err ( |e| {
87
- cloudevents:: message:: Error :: Other {
88
- source : Box :: new ( e) ,
89
- }
90
- } ) ?) ,
91
- ) ?
60
+ visitor = visitor. set_extension ( name, MessageAttributeValue :: String ( hv) ) ?
92
61
}
93
62
}
94
63
@@ -100,51 +69,32 @@ impl BinaryDeserializer for ConsumerMessageDeserializer {
100
69
}
101
70
}
102
71
103
- impl StructuredDeserializer for ConsumerMessageDeserializer {
72
+ impl < ' a > StructuredDeserializer for ConsumerMessageDeserializer < ' a > {
104
73
fn deserialize_structured < R : Sized , V : StructuredSerializer < R > > ( self , visitor : V ) -> Result < R > {
105
74
visitor. set_structured_event ( self . payload . unwrap ( ) )
106
75
}
107
76
}
108
77
109
- impl MessageDeserializer for ConsumerMessageDeserializer {
78
+ impl < ' a > MessageDeserializer for ConsumerMessageDeserializer < ' a > {
110
79
fn encoding ( & self ) -> Encoding {
111
- match (
112
- self . headers
113
- . get ( "content-type" )
114
- . map ( |s| String :: from_utf8 ( s. to_vec ( ) ) . ok ( ) )
115
- . flatten ( )
116
- . map ( |s| s. starts_with ( headers:: CLOUDEVENTS_JSON_HEADER ) )
117
- . unwrap_or ( false ) ,
118
- self . headers . get ( headers:: SPEC_VERSION_HEADER ) ,
119
- ) {
120
- ( true , _) => Encoding :: STRUCTURED ,
121
- ( _, Some ( _) ) => Encoding :: BINARY ,
122
- _ => Encoding :: UNKNOWN ,
80
+ match self . headers . iter ( PropertyCode :: UserProperty ) . count ( ) == 0 {
81
+ true => Encoding :: STRUCTURED ,
82
+ false => Encoding :: BINARY ,
123
83
}
124
84
}
125
85
}
126
86
127
- pub fn record_to_event ( msg : & Message , version : headers:: MqttVersion ) -> Result < Event > {
128
- match version {
129
- headers:: MqttVersion :: V5 => {
130
- BinaryDeserializer :: into_event ( ConsumerMessageDeserializer :: new ( msg) ?)
131
- }
132
- headers:: MqttVersion :: V3_1 => {
133
- StructuredDeserializer :: into_event ( ConsumerMessageDeserializer :: new ( msg) ?)
134
- }
135
- headers:: MqttVersion :: V3_1_1 => {
136
- StructuredDeserializer :: into_event ( ConsumerMessageDeserializer :: new ( msg) ?)
137
- }
138
- }
87
+ pub fn record_to_event ( msg : & Message ) -> Result < Event > {
88
+ MessageDeserializer :: into_event ( ConsumerMessageDeserializer :: new ( msg) ?)
139
89
}
140
90
141
91
pub trait MessageExt {
142
- fn to_event ( & self , version : headers :: MqttVersion ) -> Result < Event > ;
92
+ fn to_event ( & self ) -> Result < Event > ;
143
93
}
144
94
145
95
impl MessageExt for Message {
146
- fn to_event ( & self , version : headers :: MqttVersion ) -> Result < Event > {
147
- record_to_event ( self , version )
96
+ fn to_event ( & self ) -> Result < Event > {
97
+ record_to_event ( self )
148
98
}
149
99
}
150
100
0 commit comments