1use crate::draft07::message::ControlMessage;
2use crate::fields::{FieldMap as Map, FieldValue as Value};
3use crate::types::*;
4
5use crate::fields::params::{kvp_to_json_d07, kvp_to_json_d07_setup};
6
7fn vi(v: u64) -> Value {
8 Value::Uint(v)
9}
10
11fn ns_to_json(ns: &TrackNamespace) -> Value {
12 Value::Array(
13 ns.0.iter().map(|e| Value::Text(String::from_utf8_lossy(e).into_owned())).collect(),
14 )
15}
16
17pub fn message_fields(msg: &ControlMessage) -> Map {
23 let obj = match msg {
24 ControlMessage::ClientSetup(m) => {
25 let mut o = Map::new();
26 o.insert(
27 "supported_versions".into(),
28 Value::Array(m.supported_versions.iter().map(|v| vi(v.into_inner())).collect()),
29 );
30 o.insert("parameters".into(), kvp_to_json_d07_setup(&m.parameters));
31 o
32 }
33 ControlMessage::ServerSetup(m) => {
34 let mut o = Map::new();
35 o.insert("selected_version".into(), vi(m.selected_version.into_inner()));
36 o.insert("parameters".into(), kvp_to_json_d07_setup(&m.parameters));
37 o
38 }
39 ControlMessage::GoAway(m) => {
40 let mut o = Map::new();
41 o.insert(
42 "new_session_uri".into(),
43 Value::Text(String::from_utf8_lossy(&m.new_session_uri).into_owned()),
44 );
45 o
46 }
47 ControlMessage::MaxSubscribeId(m) => {
48 let mut o = Map::new();
49 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
50 o
51 }
52 ControlMessage::Subscribe(m) => {
53 let mut o = Map::new();
54 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
55 o.insert("track_alias".into(), vi(m.track_alias.into_inner()));
56 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
57 o.insert(
58 "track_name".into(),
59 Value::Text(String::from_utf8_lossy(&m.track_name).into_owned()),
60 );
61 o.insert("subscriber_priority".into(), vi(m.subscriber_priority as u64));
62 o.insert("group_order".into(), vi(m.group_order as u64));
63 o.insert("filter_type".into(), vi(m.filter_type as u64));
64 if let Some(loc) = &m.start_location {
65 o.insert("start_group".into(), vi(loc.group.into_inner()));
66 o.insert("start_object".into(), vi(loc.object.into_inner()));
67 }
68 if let Some(eg) = &m.end_group {
69 o.insert("end_group".into(), vi(eg.into_inner()));
70 }
71 if let Some(eo) = &m.end_object {
72 o.insert("end_object".into(), vi(eo.into_inner()));
73 }
74 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
75 o
76 }
77 ControlMessage::SubscribeOk(m) => {
78 let mut o = Map::new();
79 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
80 o.insert("expires".into(), vi(m.expires.into_inner()));
81 o.insert("group_order".into(), vi(m.group_order as u64));
82 o.insert("content_exists".into(), vi(m.content_exists as u64));
83 if let Some(gid) = &m.largest_group_id {
84 o.insert("largest_group_id".into(), vi(gid.into_inner()));
85 }
86 if let Some(oid) = &m.largest_object_id {
87 o.insert("largest_object_id".into(), vi(oid.into_inner()));
88 }
89 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
90 o
91 }
92 ControlMessage::SubscribeError(m) => {
93 let mut o = Map::new();
94 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
95 o.insert("error_code".into(), vi(m.error_code.into_inner()));
96 o.insert(
97 "reason_phrase".into(),
98 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
99 );
100 o.insert("track_alias".into(), vi(m.track_alias.into_inner()));
101 o
102 }
103 ControlMessage::SubscribeUpdate(m) => {
104 let mut o = Map::new();
105 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
106 o.insert("start_group".into(), vi(m.start_group.into_inner()));
107 o.insert("start_object".into(), vi(m.start_object.into_inner()));
108 o.insert("end_group".into(), vi(m.end_group.into_inner()));
109 o.insert("end_object".into(), vi(m.end_object.into_inner()));
110 o.insert("subscriber_priority".into(), vi(m.subscriber_priority as u64));
111 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
112 o
113 }
114 ControlMessage::SubscribeDone(m) => {
115 let mut o = Map::new();
116 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
117 o.insert("status_code".into(), vi(m.status_code.into_inner()));
118 o.insert(
119 "reason_phrase".into(),
120 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
121 );
122 o.insert("content_exists".into(), vi(m.content_exists as u64));
123 if let Some(fg) = &m.final_group {
124 o.insert("final_group".into(), vi(fg.into_inner()));
125 }
126 if let Some(fo) = &m.final_object {
127 o.insert("final_object".into(), vi(fo.into_inner()));
128 }
129 o
130 }
131 ControlMessage::Unsubscribe(m) => {
132 let mut o = Map::new();
133 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
134 o
135 }
136 ControlMessage::Announce(m) => {
137 let mut o = Map::new();
138 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
139 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
140 o
141 }
142 ControlMessage::AnnounceOk(m) => {
143 let mut o = Map::new();
144 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
145 o
146 }
147 ControlMessage::AnnounceError(m) => {
148 let mut o = Map::new();
149 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
150 o.insert("error_code".into(), vi(m.error_code.into_inner()));
151 o.insert(
152 "reason_phrase".into(),
153 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
154 );
155 o
156 }
157 ControlMessage::AnnounceCancel(m) => {
158 let mut o = Map::new();
159 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
160 o.insert("error_code".into(), vi(m.error_code.into_inner()));
161 o.insert(
162 "reason_phrase".into(),
163 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
164 );
165 o
166 }
167 ControlMessage::Unannounce(m) => {
168 let mut o = Map::new();
169 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
170 o
171 }
172 ControlMessage::SubscribeAnnounces(m) => {
173 let mut o = Map::new();
174 o.insert("track_namespace_prefix".into(), ns_to_json(&m.track_namespace_prefix));
175 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
176 o
177 }
178 ControlMessage::SubscribeAnnouncesOk(m) => {
179 let mut o = Map::new();
180 o.insert("track_namespace_prefix".into(), ns_to_json(&m.track_namespace_prefix));
181 o
182 }
183 ControlMessage::SubscribeAnnouncesError(m) => {
184 let mut o = Map::new();
185 o.insert("track_namespace_prefix".into(), ns_to_json(&m.track_namespace_prefix));
186 o.insert("error_code".into(), vi(m.error_code.into_inner()));
187 o.insert(
188 "reason_phrase".into(),
189 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
190 );
191 o
192 }
193 ControlMessage::UnsubscribeAnnounces(m) => {
194 let mut o = Map::new();
195 o.insert("track_namespace_prefix".into(), ns_to_json(&m.track_namespace_prefix));
196 o
197 }
198 ControlMessage::TrackStatusRequest(m) => {
199 let mut o = Map::new();
200 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
201 o.insert(
202 "track_name".into(),
203 Value::Text(String::from_utf8_lossy(&m.track_name).into_owned()),
204 );
205 o
206 }
207 ControlMessage::TrackStatus(m) => {
208 let mut o = Map::new();
209 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
210 o.insert(
211 "track_name".into(),
212 Value::Text(String::from_utf8_lossy(&m.track_name).into_owned()),
213 );
214 o.insert("status_code".into(), vi(m.status_code.into_inner()));
215 o.insert("last_group_id".into(), vi(m.last_group_id.into_inner()));
216 o.insert("last_object_id".into(), vi(m.last_object_id.into_inner()));
217 o
218 }
219 ControlMessage::Fetch(m) => {
220 let mut o = Map::new();
221 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
222 o.insert("track_namespace".into(), ns_to_json(&m.track_namespace));
223 o.insert(
224 "track_name".into(),
225 Value::Text(String::from_utf8_lossy(&m.track_name).into_owned()),
226 );
227 o.insert("subscriber_priority".into(), vi(m.subscriber_priority as u64));
228 o.insert("group_order".into(), vi(m.group_order as u64));
229 o.insert("start_group".into(), vi(m.start_group.into_inner()));
230 o.insert("start_object".into(), vi(m.start_object.into_inner()));
231 o.insert("end_group".into(), vi(m.end_group.into_inner()));
232 o.insert("end_object".into(), vi(m.end_object.into_inner()));
233 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
234 o
235 }
236 ControlMessage::FetchOk(m) => {
237 let mut o = Map::new();
238 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
239 o.insert("group_order".into(), vi(m.group_order as u64));
240 o.insert("end_of_track".into(), vi(m.end_of_track as u64));
241 if let Some(gid) = &m.largest_group_id {
242 o.insert("largest_group_id".into(), vi(gid.into_inner()));
243 }
244 if let Some(oid) = &m.largest_object_id {
245 o.insert("largest_object_id".into(), vi(oid.into_inner()));
246 }
247 o.insert("parameters".into(), kvp_to_json_d07(&m.parameters));
248 o
249 }
250 ControlMessage::FetchError(m) => {
251 let mut o = Map::new();
252 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
253 o.insert("error_code".into(), vi(m.error_code.into_inner()));
254 o.insert(
255 "reason_phrase".into(),
256 Value::Text(String::from_utf8_lossy(&m.reason_phrase).into_owned()),
257 );
258 o
259 }
260 ControlMessage::FetchCancel(m) => {
261 let mut o = Map::new();
262 o.insert("subscribe_id".into(), vi(m.subscribe_id.into_inner()));
263 o
264 }
265 };
266 obj
267}