Skip to main content

moqtap_codec/draft07/
fields.rs

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
17/// This draft's field names for a decoded control message.
18///
19/// Keys are the names this draft gives its fields, in the order it defines
20/// them. An optional field the message did not carry is absent rather than
21/// zero.
22pub 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}