1use bytes::{Buf, BufMut};
11
12use crate::error::CodecError;
13use crate::version::DraftVersion;
14
15pub use crate::data_dispatch::{
16 reemit_subgroup_object, AnyFetchEndOfRange, AnyFetchFrame, AnyFetchGroupOrder, AnyFetchObject,
17 AnyFetchObjectMeta, AnyFetchObjectReader, AnyFetchObjectWriter, AnySubgroupObject,
18 AnySubgroupObjectMeta, AnySubgroupObjectReader, AnySubgroupObjectWriter, FetchReemit, Reemit,
19};
20
21macro_rules! dispatch_enum {
26 (
27 $(#[$meta:meta])*
28 $vis:vis enum $name:ident {
29 $(
30 #[cfg(feature = $feat:literal)]
31 $variant:ident => $module:path,
32 )+
33 }
34 decode($decode_fn:ident);
35 encode($encode_fn:ident -> $encode_ret:ty);
36 ) => {
37 $(#[$meta])*
38 $vis enum $name {
39 $(
40 #[cfg(feature = $feat)]
41 #[doc = concat!("Draft-", $feat, " variant.")]
42 $variant($module),
43 )+
44 }
45
46 impl $name {
47 #[allow(unused_variables)]
49 pub fn decode(
50 version: DraftVersion,
51 buf: &mut impl Buf,
52 ) -> Result<Self, CodecError> {
53 match version {
54 $(
55 #[cfg(feature = $feat)]
56 DraftVersion::$variant => {
57 <$module>::$decode_fn(buf).map($name::$variant)
58 }
59 )+
60 #[allow(unreachable_patterns)]
61 _ => Err(CodecError::UnsupportedDraft(
62 format!("draft {:?} not enabled via feature flag", version),
63 )),
64 }
65 }
66
67 #[allow(unused_variables, unreachable_code)]
69 pub fn encode(&self, buf: &mut impl BufMut) -> $encode_ret {
70 match self {
71 $(
72 #[cfg(feature = $feat)]
73 $name::$variant(inner) => inner.$encode_fn(buf),
74 )+
75 #[allow(unreachable_patterns)]
76 _ => unreachable!("AnyXxx enum has no enabled variants"),
77 }
78 }
79
80 #[allow(unreachable_code)]
82 pub fn draft(&self) -> DraftVersion {
83 match self {
84 $(
85 #[cfg(feature = $feat)]
86 $name::$variant(_) => DraftVersion::$variant,
87 )+
88 #[allow(unreachable_patterns)]
89 _ => unreachable!("AnyXxx enum has no enabled variants"),
90 }
91 }
92 }
93 };
94}
95
96macro_rules! subgroup_header_accessor {
103 (
104 $(#[$meta:meta])*
105 $name:ident -> $ret:ty;
106 $(
107 [ $( $variant:ident @ $feat:literal ),+ $(,)? ] => |$h:ident| $body:expr
108 ),+ $(,)?
109 ) => {
110 $(#[$meta])*
111 #[allow(unreachable_code)]
112 pub fn $name(&self) -> $ret {
113 match self {
114 $($(
115 #[cfg(feature = $feat)]
116 AnySubgroupHeader::$variant($h) => $body,
117 )+)+
118 #[allow(unreachable_patterns)]
119 _ => unreachable!("AnySubgroupHeader has no enabled variants"),
120 }
121 }
122 };
123}
124
125dispatch_enum! {
128 #[derive(Debug, Clone)]
130 pub enum AnyControlMessage {
131 #[cfg(feature = "draft07")]
132 Draft07 => crate::draft07::message::ControlMessage,
133 #[cfg(feature = "draft08")]
134 Draft08 => crate::draft08::message::ControlMessage,
135 #[cfg(feature = "draft09")]
136 Draft09 => crate::draft09::message::ControlMessage,
137 #[cfg(feature = "draft10")]
138 Draft10 => crate::draft10::message::ControlMessage,
139 #[cfg(feature = "draft11")]
140 Draft11 => crate::draft11::message::ControlMessage,
141 #[cfg(feature = "draft12")]
142 Draft12 => crate::draft12::message::ControlMessage,
143 #[cfg(feature = "draft13")]
144 Draft13 => crate::draft13::message::ControlMessage,
145 #[cfg(feature = "draft14")]
146 Draft14 => crate::draft14::message::ControlMessage,
147 #[cfg(feature = "draft15")]
148 Draft15 => crate::draft15::message::ControlMessage,
149 #[cfg(feature = "draft16")]
150 Draft16 => crate::draft16::message::ControlMessage,
151 #[cfg(feature = "draft17")]
152 Draft17 => crate::draft17::message::ControlMessage,
153 #[cfg(feature = "draft18")]
154 Draft18 => crate::draft18::message::ControlMessage,
155 #[cfg(feature = "draft19")]
156 Draft19 => crate::draft19::message::ControlMessage,
157 #[cfg(feature = "draft20")]
158 Draft20 => crate::draft20::message::ControlMessage,
159 #[cfg(feature = "draft21")]
160 Draft21 => crate::draft21::message::ControlMessage,
161 #[cfg(feature = "draft22")]
162 Draft22 => crate::draft22::message::ControlMessage,
163 #[cfg(feature = "draft23")]
164 Draft23 => crate::draft23::message::ControlMessage,
165 }
166 decode(decode);
167 encode(encode -> Result<(), CodecError>);
168}
169
170impl AnyControlMessage {
171 pub fn is_setup(&self) -> bool {
181 match *self {
202 #[cfg(feature = "draft07")]
203 AnyControlMessage::Draft07(ref m) => matches!(
204 m,
205 crate::draft07::message::ControlMessage::ClientSetup(_)
206 | crate::draft07::message::ControlMessage::ServerSetup(_)
207 ),
208 #[cfg(feature = "draft08")]
209 AnyControlMessage::Draft08(ref m) => matches!(
210 m,
211 crate::draft08::message::ControlMessage::ClientSetup(_)
212 | crate::draft08::message::ControlMessage::ServerSetup(_)
213 ),
214 #[cfg(feature = "draft09")]
215 AnyControlMessage::Draft09(ref m) => matches!(
216 m,
217 crate::draft09::message::ControlMessage::ClientSetup(_)
218 | crate::draft09::message::ControlMessage::ServerSetup(_)
219 ),
220 #[cfg(feature = "draft10")]
221 AnyControlMessage::Draft10(ref m) => matches!(
222 m,
223 crate::draft10::message::ControlMessage::ClientSetup(_)
224 | crate::draft10::message::ControlMessage::ServerSetup(_)
225 ),
226 #[cfg(feature = "draft11")]
227 AnyControlMessage::Draft11(ref m) => matches!(
228 m,
229 crate::draft11::message::ControlMessage::ClientSetup(_)
230 | crate::draft11::message::ControlMessage::ServerSetup(_)
231 ),
232 #[cfg(feature = "draft12")]
233 AnyControlMessage::Draft12(ref m) => matches!(
234 m,
235 crate::draft12::message::ControlMessage::ClientSetup(_)
236 | crate::draft12::message::ControlMessage::ServerSetup(_)
237 ),
238 #[cfg(feature = "draft13")]
239 AnyControlMessage::Draft13(ref m) => matches!(
240 m,
241 crate::draft13::message::ControlMessage::ClientSetup(_)
242 | crate::draft13::message::ControlMessage::ServerSetup(_)
243 ),
244 #[cfg(feature = "draft14")]
245 AnyControlMessage::Draft14(ref m) => matches!(
246 m,
247 crate::draft14::message::ControlMessage::ClientSetup(_)
248 | crate::draft14::message::ControlMessage::ServerSetup(_)
249 ),
250 #[cfg(feature = "draft15")]
251 AnyControlMessage::Draft15(ref m) => matches!(
252 m,
253 crate::draft15::message::ControlMessage::ClientSetup(_)
254 | crate::draft15::message::ControlMessage::ServerSetup(_)
255 ),
256 #[cfg(feature = "draft16")]
257 AnyControlMessage::Draft16(ref m) => matches!(
258 m,
259 crate::draft16::message::ControlMessage::ClientSetup(_)
260 | crate::draft16::message::ControlMessage::ServerSetup(_)
261 ),
262 #[cfg(feature = "draft17")]
263 AnyControlMessage::Draft17(ref m) => {
264 matches!(m, crate::draft17::message::ControlMessage::Setup(_))
265 }
266 #[cfg(feature = "draft18")]
267 AnyControlMessage::Draft18(ref m) => {
268 matches!(m, crate::draft18::message::ControlMessage::Setup(_))
269 }
270 #[cfg(feature = "draft19")]
271 AnyControlMessage::Draft19(ref m) => {
272 matches!(m, crate::draft19::message::ControlMessage::Setup(_))
273 }
274 #[cfg(feature = "draft20")]
275 AnyControlMessage::Draft20(ref m) => {
276 matches!(m, crate::draft20::message::ControlMessage::Setup(_))
277 }
278 #[cfg(feature = "draft21")]
279 AnyControlMessage::Draft21(ref m) => {
280 matches!(m, crate::draft21::message::ControlMessage::Setup(_))
281 }
282 #[cfg(feature = "draft22")]
283 AnyControlMessage::Draft22(ref m) => {
284 matches!(m, crate::draft22::message::ControlMessage::Setup(_))
285 }
286 #[cfg(feature = "draft23")]
287 AnyControlMessage::Draft23(ref m) => {
288 matches!(m, crate::draft23::message::ControlMessage::Setup(_))
289 }
290 }
291 }
292
293 pub fn fields(&self) -> crate::fields::FieldMap {
314 match *self {
316 #[cfg(feature = "draft07")]
317 AnyControlMessage::Draft07(ref m) => crate::draft07::fields::message_fields(m),
318 #[cfg(feature = "draft08")]
319 AnyControlMessage::Draft08(ref m) => crate::draft08::fields::message_fields(m),
320 #[cfg(feature = "draft09")]
321 AnyControlMessage::Draft09(ref m) => crate::draft09::fields::message_fields(m),
322 #[cfg(feature = "draft10")]
323 AnyControlMessage::Draft10(ref m) => crate::draft10::fields::message_fields(m),
324 #[cfg(feature = "draft11")]
325 AnyControlMessage::Draft11(ref m) => crate::draft11::fields::message_fields(m),
326 #[cfg(feature = "draft12")]
327 AnyControlMessage::Draft12(ref m) => crate::draft12::fields::message_fields(m),
328 #[cfg(feature = "draft13")]
329 AnyControlMessage::Draft13(ref m) => crate::draft13::fields::message_fields(m),
330 #[cfg(feature = "draft14")]
331 AnyControlMessage::Draft14(ref m) => crate::draft14::fields::message_fields(m),
332 #[cfg(feature = "draft15")]
333 AnyControlMessage::Draft15(ref m) => crate::draft15::fields::message_fields(m),
334 #[cfg(feature = "draft16")]
335 AnyControlMessage::Draft16(ref m) => crate::draft16::fields::message_fields(m),
336 #[cfg(feature = "draft17")]
337 AnyControlMessage::Draft17(ref m) => crate::draft17::fields::message_fields(m),
338 #[cfg(feature = "draft18")]
339 AnyControlMessage::Draft18(ref m) => crate::draft18::fields::message_fields(m),
340 #[cfg(feature = "draft19")]
341 AnyControlMessage::Draft19(ref m) => crate::draft19::fields::message_fields(m),
342 #[cfg(feature = "draft20")]
343 AnyControlMessage::Draft20(ref m) => crate::draft20::fields::message_fields(m),
344 #[cfg(feature = "draft21")]
345 AnyControlMessage::Draft21(ref m) => crate::draft21::fields::message_fields(m),
346 #[cfg(feature = "draft22")]
347 AnyControlMessage::Draft22(ref m) => crate::draft22::fields::message_fields(m),
348 #[cfg(feature = "draft23")]
349 AnyControlMessage::Draft23(ref m) => crate::draft23::fields::message_fields(m),
350 }
351 }
352
353 #[allow(unreachable_code)]
359 fn message_type(&self) -> (u64, &'static str) {
360 #[allow(unused_macros)]
374 macro_rules! named {
375 ($m:expr) => {{
376 let t = $m.message_type();
377 (t.id(), t.name())
378 }};
379 }
380 match self {
381 #[cfg(feature = "draft07")]
382 AnyControlMessage::Draft07(m) => named!(m),
383 #[cfg(feature = "draft08")]
384 AnyControlMessage::Draft08(m) => named!(m),
385 #[cfg(feature = "draft09")]
386 AnyControlMessage::Draft09(m) => named!(m),
387 #[cfg(feature = "draft10")]
388 AnyControlMessage::Draft10(m) => named!(m),
389 #[cfg(feature = "draft11")]
390 AnyControlMessage::Draft11(m) => named!(m),
391 #[cfg(feature = "draft12")]
392 AnyControlMessage::Draft12(m) => named!(m),
393 #[cfg(feature = "draft13")]
394 AnyControlMessage::Draft13(m) => named!(m),
395 #[cfg(feature = "draft14")]
396 AnyControlMessage::Draft14(m) => named!(m),
397 #[cfg(feature = "draft15")]
398 AnyControlMessage::Draft15(m) => named!(m),
399 #[cfg(feature = "draft16")]
400 AnyControlMessage::Draft16(m) => named!(m),
401 #[cfg(feature = "draft17")]
402 AnyControlMessage::Draft17(m) => named!(m),
403 #[cfg(feature = "draft18")]
404 AnyControlMessage::Draft18(m) => named!(m),
405 #[cfg(feature = "draft19")]
406 AnyControlMessage::Draft19(m) => named!(m),
407 #[cfg(feature = "draft20")]
408 AnyControlMessage::Draft20(m) => named!(m),
409 #[cfg(feature = "draft21")]
410 AnyControlMessage::Draft21(m) => named!(m),
411 #[cfg(feature = "draft22")]
412 AnyControlMessage::Draft22(m) => named!(m),
413 #[cfg(feature = "draft23")]
414 AnyControlMessage::Draft23(m) => named!(m),
415 #[allow(unreachable_patterns)]
424 _ => unreachable!("AnyControlMessage has no enabled variants"),
425 }
426 }
427
428 pub fn message_type_id(&self) -> u64 {
436 self.message_type().0
437 }
438
439 pub fn message_type_name(&self) -> &'static str {
452 self.message_type().1
453 }
454
455 pub fn fetch_group_order(&self) -> Option<(u64, AnyFetchGroupOrder)> {
496 #[allow(dead_code)]
503 const GROUP_ORDER: u64 = 0x22;
504
505 #[allow(dead_code)]
506 fn fetch_group_order(
507 request_id: crate::varint::VarInt,
508 parameters: &[crate::kvp::KeyValuePair],
509 ) -> Option<(u64, AnyFetchGroupOrder)> {
510 let order = match parameters.iter().find(|p| p.key.into_inner() == GROUP_ORDER) {
513 None => AnyFetchGroupOrder::Ascending,
514 Some(p) => match &p.value {
515 crate::kvp::KvpValue::Varint(v) => match v.into_inner() {
516 0x1 => AnyFetchGroupOrder::Ascending,
517 0x2 => AnyFetchGroupOrder::Descending,
518 _ => return None,
519 },
520 crate::kvp::KvpValue::Bytes(_) => return None,
523 },
524 };
525 Some((request_id.into_inner(), order))
526 }
527
528 match *self {
530 #[cfg(feature = "draft15")]
531 AnyControlMessage::Draft15(crate::draft15::message::ControlMessage::Fetch(ref f)) => {
532 fetch_group_order(f.request_id, &f.parameters)
533 }
534 #[cfg(feature = "draft16")]
535 AnyControlMessage::Draft16(crate::draft16::message::ControlMessage::Fetch(ref f)) => {
536 fetch_group_order(f.request_id, &f.parameters)
537 }
538 #[cfg(feature = "draft17")]
539 AnyControlMessage::Draft17(crate::draft17::message::ControlMessage::Fetch(ref f)) => {
540 fetch_group_order(f.request_id, &f.parameters)
541 }
542 #[cfg(feature = "draft18")]
543 AnyControlMessage::Draft18(crate::draft18::message::ControlMessage::Fetch(ref f)) => {
544 fetch_group_order(f.request_id, &f.parameters)
545 }
546 #[cfg(feature = "draft19")]
547 AnyControlMessage::Draft19(crate::draft19::message::ControlMessage::Fetch(ref f)) => {
548 fetch_group_order(f.request_id, &f.parameters)
549 }
550 #[cfg(feature = "draft20")]
551 AnyControlMessage::Draft20(crate::draft20::message::ControlMessage::Fetch(ref f)) => {
552 fetch_group_order(f.request_id, &f.parameters)
553 }
554 #[cfg(feature = "draft21")]
555 AnyControlMessage::Draft21(crate::draft21::message::ControlMessage::Fetch(ref f)) => {
556 fetch_group_order(f.request_id, &f.parameters)
557 }
558 #[cfg(feature = "draft22")]
559 AnyControlMessage::Draft22(crate::draft22::message::ControlMessage::Fetch(ref f)) => {
560 fetch_group_order(f.request_id, &f.parameters)
561 }
562 #[cfg(feature = "draft23")]
563 AnyControlMessage::Draft23(crate::draft23::message::ControlMessage::Fetch(ref f)) => {
564 fetch_group_order(f.request_id, &f.parameters)
565 }
566 #[cfg(feature = "draft07")]
577 AnyControlMessage::Draft07(_) => None,
578 #[cfg(feature = "draft08")]
579 AnyControlMessage::Draft08(_) => None,
580 #[cfg(feature = "draft09")]
581 AnyControlMessage::Draft09(_) => None,
582 #[cfg(feature = "draft10")]
583 AnyControlMessage::Draft10(_) => None,
584 #[cfg(feature = "draft11")]
585 AnyControlMessage::Draft11(_) => None,
586 #[cfg(feature = "draft12")]
587 AnyControlMessage::Draft12(_) => None,
588 #[cfg(feature = "draft13")]
589 AnyControlMessage::Draft13(_) => None,
590 #[cfg(feature = "draft14")]
591 AnyControlMessage::Draft14(_) => None,
592 #[cfg(feature = "draft15")]
593 AnyControlMessage::Draft15(_) => None,
594 #[cfg(feature = "draft16")]
595 AnyControlMessage::Draft16(_) => None,
596 #[cfg(feature = "draft17")]
597 AnyControlMessage::Draft17(_) => None,
598 #[cfg(feature = "draft18")]
599 AnyControlMessage::Draft18(_) => None,
600 #[cfg(feature = "draft19")]
601 AnyControlMessage::Draft19(_) => None,
602 #[cfg(feature = "draft20")]
603 AnyControlMessage::Draft20(_) => None,
604 #[cfg(feature = "draft21")]
605 AnyControlMessage::Draft21(_) => None,
606 #[cfg(feature = "draft22")]
607 AnyControlMessage::Draft22(_) => None,
608 #[cfg(feature = "draft23")]
609 AnyControlMessage::Draft23(_) => None,
610 }
611 }
612}
613
614dispatch_enum! {
617 #[derive(Debug, Clone)]
619 pub enum AnySubgroupHeader {
620 #[cfg(feature = "draft07")]
621 Draft07 => crate::draft07::data_stream::SubgroupHeader,
622 #[cfg(feature = "draft08")]
623 Draft08 => crate::draft08::data_stream::SubgroupHeader,
624 #[cfg(feature = "draft09")]
625 Draft09 => crate::draft09::data_stream::SubgroupHeader,
626 #[cfg(feature = "draft10")]
627 Draft10 => crate::draft10::data_stream::SubgroupHeader,
628 #[cfg(feature = "draft11")]
629 Draft11 => crate::draft11::data_stream::SubgroupHeader,
630 #[cfg(feature = "draft12")]
631 Draft12 => crate::draft12::data_stream::SubgroupHeader,
632 #[cfg(feature = "draft13")]
633 Draft13 => crate::draft13::data_stream::SubgroupHeader,
634 #[cfg(feature = "draft14")]
635 Draft14 => crate::draft14::data_stream::SubgroupHeader,
636 #[cfg(feature = "draft15")]
637 Draft15 => crate::draft15::data_stream::SubgroupHeader,
638 #[cfg(feature = "draft16")]
639 Draft16 => crate::draft16::data_stream::SubgroupHeader,
640 #[cfg(feature = "draft17")]
641 Draft17 => crate::draft17::data_stream::SubgroupHeader,
642 #[cfg(feature = "draft18")]
643 Draft18 => crate::draft18::data_stream::SubgroupHeader,
644 #[cfg(feature = "draft19")]
645 Draft19 => crate::draft19::data_stream::SubgroupHeader,
646 #[cfg(feature = "draft20")]
647 Draft20 => crate::draft20::data_stream::SubgroupHeader,
648 #[cfg(feature = "draft21")]
649 Draft21 => crate::draft21::data_stream::SubgroupHeader,
650 #[cfg(feature = "draft22")]
651 Draft22 => crate::draft22::data_stream::SubgroupHeader,
652 #[cfg(feature = "draft23")]
653 Draft23 => crate::draft23::data_stream::SubgroupHeader,
654 }
655 decode(decode);
656 encode(encode -> ());
657}
658
659impl AnySubgroupHeader {
660 #[allow(unused_variables)]
673 pub fn decode_stream(version: DraftVersion, buf: &mut impl Buf) -> Result<Self, CodecError> {
674 match version {
675 #[cfg(feature = "draft07")]
676 DraftVersion::Draft07 => {
677 crate::draft07::data_stream::SubgroupHeader::decode_stream(buf)
678 .map(AnySubgroupHeader::Draft07)
679 }
680 #[cfg(feature = "draft08")]
681 DraftVersion::Draft08 => {
682 crate::draft08::data_stream::SubgroupHeader::decode_stream(buf)
683 .map(AnySubgroupHeader::Draft08)
684 }
685 #[cfg(feature = "draft09")]
686 DraftVersion::Draft09 => {
687 crate::draft09::data_stream::SubgroupHeader::decode_stream(buf)
688 .map(AnySubgroupHeader::Draft09)
689 }
690 #[cfg(feature = "draft10")]
691 DraftVersion::Draft10 => {
692 crate::draft10::data_stream::SubgroupHeader::decode_stream(buf)
693 .map(AnySubgroupHeader::Draft10)
694 }
695 #[cfg(feature = "draft11")]
696 DraftVersion::Draft11 => {
697 crate::draft11::data_stream::SubgroupHeader::decode_stream(buf)
698 .map(AnySubgroupHeader::Draft11)
699 }
700 #[cfg(feature = "draft12")]
701 DraftVersion::Draft12 => {
702 crate::draft12::data_stream::SubgroupHeader::decode_stream(buf)
703 .map(AnySubgroupHeader::Draft12)
704 }
705 #[cfg(feature = "draft13")]
706 DraftVersion::Draft13 => {
707 crate::draft13::data_stream::SubgroupHeader::decode_stream(buf)
708 .map(AnySubgroupHeader::Draft13)
709 }
710 #[cfg(feature = "draft14")]
711 DraftVersion::Draft14 => crate::draft14::data_stream::SubgroupHeader::decode(buf)
712 .map(AnySubgroupHeader::Draft14),
713 #[cfg(feature = "draft15")]
714 DraftVersion::Draft15 => crate::draft15::data_stream::SubgroupHeader::decode(buf)
715 .map(AnySubgroupHeader::Draft15),
716 #[cfg(feature = "draft16")]
717 DraftVersion::Draft16 => crate::draft16::data_stream::SubgroupHeader::decode(buf)
718 .map(AnySubgroupHeader::Draft16),
719 #[cfg(feature = "draft17")]
720 DraftVersion::Draft17 => crate::draft17::data_stream::SubgroupHeader::decode(buf)
721 .map(AnySubgroupHeader::Draft17),
722 #[cfg(feature = "draft18")]
723 DraftVersion::Draft18 => crate::draft18::data_stream::SubgroupHeader::decode(buf)
724 .map(AnySubgroupHeader::Draft18),
725 #[cfg(feature = "draft19")]
726 DraftVersion::Draft19 => crate::draft19::data_stream::SubgroupHeader::decode(buf)
727 .map(AnySubgroupHeader::Draft19),
728 #[cfg(feature = "draft20")]
729 DraftVersion::Draft20 => crate::draft20::data_stream::SubgroupHeader::decode(buf)
730 .map(AnySubgroupHeader::Draft20),
731 #[cfg(feature = "draft21")]
732 DraftVersion::Draft21 => crate::draft21::data_stream::SubgroupHeader::decode(buf)
733 .map(AnySubgroupHeader::Draft21),
734 #[cfg(feature = "draft22")]
735 DraftVersion::Draft22 => crate::draft22::data_stream::SubgroupHeader::decode(buf)
736 .map(AnySubgroupHeader::Draft22),
737 #[cfg(feature = "draft23")]
738 DraftVersion::Draft23 => crate::draft23::data_stream::SubgroupHeader::decode(buf)
739 .map(AnySubgroupHeader::Draft23),
740 #[allow(unreachable_patterns)]
741 _ => Err(CodecError::UnsupportedDraft(format!(
742 "draft {version:?} not enabled via feature flag"
743 ))),
744 }
745 }
746
747 #[allow(unreachable_code, unused_variables)]
760 pub fn encode_stream(&self, buf: &mut impl BufMut) {
761 match self {
762 #[cfg(feature = "draft07")]
763 AnySubgroupHeader::Draft07(h) => h.encode_stream(buf),
764 #[cfg(feature = "draft08")]
765 AnySubgroupHeader::Draft08(h) => h.encode_stream(buf),
766 #[cfg(feature = "draft09")]
767 AnySubgroupHeader::Draft09(h) => h.encode_stream(buf),
768 #[cfg(feature = "draft10")]
769 AnySubgroupHeader::Draft10(h) => h.encode_stream(buf),
770 #[cfg(feature = "draft11")]
771 AnySubgroupHeader::Draft11(h) => h.encode_stream(buf),
772 #[cfg(feature = "draft12")]
773 AnySubgroupHeader::Draft12(h) => h.encode_stream(buf),
774 #[cfg(feature = "draft13")]
775 AnySubgroupHeader::Draft13(h) => h.encode_stream(buf),
776 #[cfg(feature = "draft14")]
780 AnySubgroupHeader::Draft14(h) => h.encode(buf),
781 #[cfg(feature = "draft15")]
782 AnySubgroupHeader::Draft15(h) => h.encode(buf),
783 #[cfg(feature = "draft16")]
784 AnySubgroupHeader::Draft16(h) => h.encode(buf),
785 #[cfg(feature = "draft17")]
786 AnySubgroupHeader::Draft17(h) => h.encode(buf),
787 #[cfg(feature = "draft18")]
788 AnySubgroupHeader::Draft18(h) => h.encode(buf),
789 #[cfg(feature = "draft19")]
790 AnySubgroupHeader::Draft19(h) => h.encode(buf),
791 #[cfg(feature = "draft20")]
792 AnySubgroupHeader::Draft20(h) => h.encode(buf),
793 #[cfg(feature = "draft21")]
794 AnySubgroupHeader::Draft21(h) => h.encode(buf),
795 #[cfg(feature = "draft22")]
796 AnySubgroupHeader::Draft22(h) => h.encode(buf),
797 #[cfg(feature = "draft23")]
798 AnySubgroupHeader::Draft23(h) => h.encode(buf),
799 #[allow(unreachable_patterns)]
800 _ => unreachable!("AnySubgroupHeader has no enabled variants"),
801 }
802 }
803
804 #[allow(unreachable_code, unused_variables, unused_mut)]
825 pub fn encode_stream_checked(&self, buf: &mut impl BufMut) -> Result<(), CodecError> {
826 let mut body = Vec::with_capacity(32);
827 match self {
828 #[cfg(feature = "draft07")]
829 AnySubgroupHeader::Draft07(h) => h.encode_stream(&mut body),
830 #[cfg(feature = "draft08")]
831 AnySubgroupHeader::Draft08(h) => h.encode_stream(&mut body),
832 #[cfg(feature = "draft09")]
833 AnySubgroupHeader::Draft09(h) => h.encode_stream(&mut body),
834 #[cfg(feature = "draft10")]
835 AnySubgroupHeader::Draft10(h) => h.encode_stream(&mut body),
836 #[cfg(feature = "draft11")]
839 AnySubgroupHeader::Draft11(h) => {
840 crate::varint::VarInt::from_usize(h.stream_type as usize).encode(&mut body);
841 h.encode_checked(&mut body)?;
842 }
843 #[cfg(feature = "draft12")]
844 AnySubgroupHeader::Draft12(h) => {
845 crate::varint::VarInt::from_usize(h.stream_type as usize).encode(&mut body);
846 h.encode_checked(&mut body)?;
847 }
848 #[cfg(feature = "draft13")]
849 AnySubgroupHeader::Draft13(h) => {
850 crate::varint::VarInt::from_usize(h.stream_type as usize).encode(&mut body);
851 h.encode_checked(&mut body)?;
852 }
853 #[cfg(feature = "draft14")]
856 AnySubgroupHeader::Draft14(h) => h.encode_checked(&mut body)?,
857 #[cfg(feature = "draft15")]
858 AnySubgroupHeader::Draft15(h) => h.encode_checked(&mut body)?,
859 #[cfg(feature = "draft16")]
860 AnySubgroupHeader::Draft16(h) => h.encode_checked(&mut body)?,
861 #[cfg(feature = "draft17")]
862 AnySubgroupHeader::Draft17(h) => h.encode_checked(&mut body)?,
863 #[cfg(feature = "draft18")]
864 AnySubgroupHeader::Draft18(h) => h.encode_checked(&mut body)?,
865 #[cfg(feature = "draft19")]
866 AnySubgroupHeader::Draft19(h) => h.encode_checked(&mut body)?,
867 #[cfg(feature = "draft20")]
868 AnySubgroupHeader::Draft20(h) => h.encode_checked(&mut body)?,
869 #[cfg(feature = "draft21")]
870 AnySubgroupHeader::Draft21(h) => h.encode_checked(&mut body)?,
871 #[cfg(feature = "draft22")]
872 AnySubgroupHeader::Draft22(h) => h.encode_checked(&mut body)?,
873 #[cfg(feature = "draft23")]
874 AnySubgroupHeader::Draft23(h) => h.encode_checked(&mut body)?,
875 #[allow(unreachable_patterns)]
876 _ => unreachable!("AnySubgroupHeader has no enabled variants"),
877 }
878 buf.put_slice(&body);
879 Ok(())
880 }
881
882 subgroup_header_accessor! {
883 track_alias -> u64;
885 [
886 Draft07 @ "draft07", Draft08 @ "draft08", Draft09 @ "draft09",
887 Draft10 @ "draft10", Draft11 @ "draft11", Draft12 @ "draft12",
888 Draft13 @ "draft13", Draft14 @ "draft14", Draft15 @ "draft15",
889 Draft16 @ "draft16", Draft17 @ "draft17", Draft18 @ "draft18",
890 Draft19 @ "draft19", Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
891 ] => |h| h.track_alias.into_inner(),
892 }
893
894 subgroup_header_accessor! {
895 group_id -> u64;
897 [
898 Draft07 @ "draft07", Draft08 @ "draft08", Draft09 @ "draft09",
899 Draft10 @ "draft10", Draft11 @ "draft11", Draft12 @ "draft12",
900 Draft13 @ "draft13", Draft14 @ "draft14", Draft15 @ "draft15",
901 Draft16 @ "draft16", Draft17 @ "draft17", Draft18 @ "draft18",
902 Draft19 @ "draft19", Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
903 ] => |h| h.group_id.into_inner(),
904 }
905
906 subgroup_header_accessor! {
907 publisher_priority -> Option<u8>;
910 [
911 Draft07 @ "draft07", Draft08 @ "draft08", Draft09 @ "draft09",
912 Draft10 @ "draft10", Draft11 @ "draft11", Draft12 @ "draft12",
913 Draft13 @ "draft13", Draft14 @ "draft14",
914 ] => |h| Some(h.publisher_priority),
915 [
916 Draft15 @ "draft15", Draft16 @ "draft16", Draft17 @ "draft17",
917 Draft18 @ "draft18", Draft19 @ "draft19", Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
918 ] => |h| h.publisher_priority,
919 }
920
921 subgroup_header_accessor! {
922 subgroup_id -> Option<u64>;
938 [
939 Draft07 @ "draft07", Draft08 @ "draft08", Draft09 @ "draft09",
940 Draft10 @ "draft10",
941 ] => |h| Some(h.subgroup_id.into_inner()),
942 [Draft11 @ "draft11"] => |h| {
943 use crate::draft11::data_stream::StreamType;
944 match h.stream_type {
945 StreamType::SubgroupFirstObj | StreamType::SubgroupFirstObjExt => None,
946 _ => Some(h.subgroup_id.into_inner()),
947 }
948 },
949 [Draft12 @ "draft12"] => |h| {
950 use crate::draft12::data_stream::StreamType;
951 match h.stream_type {
952 StreamType::SubgroupFirstObj
953 | StreamType::SubgroupFirstObjExt
954 | StreamType::SubgroupFirstObjEog
955 | StreamType::SubgroupFirstObjEogExt => None,
956 _ => Some(h.subgroup_id.into_inner()),
957 }
958 },
959 [Draft13 @ "draft13"] => |h| {
960 use crate::draft13::data_stream::StreamType;
961 match h.stream_type {
962 StreamType::SubgroupFirstObj
963 | StreamType::SubgroupFirstObjExt
964 | StreamType::SubgroupFirstObjEog
965 | StreamType::SubgroupFirstObjEogExt => None,
966 _ => Some(h.subgroup_id.into_inner()),
967 }
968 },
969 [Draft14 @ "draft14"] => |h| {
970 if h.stream_type.has_subgroup_id_field() {
971 Some(h.subgroup_id.map_or(0, |id| id.into_inner()))
972 } else if h.stream_type.subgroup_id_is_first_object() {
973 None
974 } else {
975 Some(0)
976 }
977 },
978 [Draft15 @ "draft15", Draft16 @ "draft16"] => |h| {
999 if h.header_type & 0x06 == 0x06 {
1006 None
1007 } else if h.has_explicit_subgroup_id() {
1008 Some(h.subgroup_id.into_inner())
1009 } else if h.subgroup_id_from_first_object() {
1010 None
1011 } else {
1012 Some(0)
1013 }
1014 },
1015 [
1016 Draft17 @ "draft17", Draft18 @ "draft18", Draft19 @ "draft19",
1017 Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
1018 ] => |h| {
1019 match h.subgroup_id_mode() {
1020 0 => Some(0),
1021 2 => Some(h.subgroup_id.into_inner()),
1022 _ => None,
1025 }
1026 },
1027 }
1028
1029 subgroup_header_accessor! {
1030 subgroup_id_mode -> Option<u8>;
1065 [
1066 Draft07 @ "draft07", Draft08 @ "draft08", Draft09 @ "draft09",
1067 Draft10 @ "draft10", Draft11 @ "draft11", Draft12 @ "draft12",
1068 Draft13 @ "draft13", Draft14 @ "draft14",
1069 ] => |_h| None,
1070 [Draft15 @ "draft15", Draft16 @ "draft16"] => |h| {
1076 Some((h.header_type & 0x06) >> 1)
1077 },
1078 [
1079 Draft17 @ "draft17", Draft18 @ "draft18", Draft19 @ "draft19",
1080 Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
1081 ] => |h| { Some(h.subgroup_id_mode()) },
1082 }
1083
1084 subgroup_header_accessor! {
1085 carries_extension_block -> bool;
1106 [Draft07 @ "draft07"] => |_h| false,
1107 [Draft08 @ "draft08", Draft09 @ "draft09", Draft10 @ "draft10"] => |_h| true,
1108 [Draft11 @ "draft11", Draft12 @ "draft12", Draft13 @ "draft13"] => |h| {
1109 h.stream_type.has_extensions()
1110 },
1111 [Draft14 @ "draft14"] => |h| h.stream_type.extensions_present(),
1112 [Draft15 @ "draft15", Draft16 @ "draft16"] => |h| h.has_extensions(),
1113 [
1114 Draft17 @ "draft17", Draft18 @ "draft18", Draft19 @ "draft19",
1115 Draft20 @ "draft20", Draft21 @ "draft21", Draft22 @ "draft22", Draft23 @ "draft23",
1116 ] => |h| { h.has_properties() },
1117 }
1118}
1119
1120dispatch_enum! {
1121 #[derive(Debug, Clone)]
1123 pub enum AnyObjectHeader {
1124 #[cfg(feature = "draft07")]
1125 Draft07 => crate::draft07::data_stream::ObjectHeader,
1126 #[cfg(feature = "draft08")]
1127 Draft08 => crate::draft08::data_stream::ObjectHeader,
1128 #[cfg(feature = "draft09")]
1129 Draft09 => crate::draft09::data_stream::ObjectHeader,
1130 #[cfg(feature = "draft10")]
1131 Draft10 => crate::draft10::data_stream::ObjectHeader,
1132 #[cfg(feature = "draft11")]
1133 Draft11 => crate::draft11::data_stream::ObjectHeader,
1134 #[cfg(feature = "draft12")]
1135 Draft12 => crate::draft12::data_stream::ObjectHeader,
1136 #[cfg(feature = "draft13")]
1137 Draft13 => crate::draft13::data_stream::ObjectHeader,
1138 }
1143 decode(decode);
1144 encode(encode -> ());
1145}
1146
1147dispatch_enum! {
1148 #[derive(Debug, Clone)]
1166 pub enum AnyDatagramHeader {
1167 #[cfg(feature = "draft07")]
1168 Draft07 => crate::draft07::data_stream::Datagram,
1169 #[cfg(feature = "draft08")]
1170 Draft08 => crate::draft08::data_stream::Datagram,
1171 #[cfg(feature = "draft09")]
1172 Draft09 => crate::draft09::data_stream::Datagram,
1173 #[cfg(feature = "draft10")]
1174 Draft10 => crate::draft10::data_stream::Datagram,
1175 #[cfg(feature = "draft11")]
1176 Draft11 => crate::draft11::data_stream::Datagram,
1177 #[cfg(feature = "draft12")]
1178 Draft12 => crate::draft12::data_stream::Datagram,
1179 #[cfg(feature = "draft13")]
1180 Draft13 => crate::draft13::data_stream::Datagram,
1181 #[cfg(feature = "draft14")]
1182 Draft14 => crate::draft14::data_stream::DatagramObject,
1183 #[cfg(feature = "draft15")]
1184 Draft15 => crate::draft15::data_stream::DatagramHeader,
1185 #[cfg(feature = "draft16")]
1186 Draft16 => crate::draft16::data_stream::DatagramHeader,
1187 #[cfg(feature = "draft17")]
1188 Draft17 => crate::draft17::data_stream::DatagramHeader,
1189 #[cfg(feature = "draft18")]
1190 Draft18 => crate::draft18::data_stream::DatagramHeader,
1191 #[cfg(feature = "draft19")]
1192 Draft19 => crate::draft19::data_stream::DatagramHeader,
1193 #[cfg(feature = "draft20")]
1194 Draft20 => crate::draft20::data_stream::DatagramHeader,
1195 #[cfg(feature = "draft21")]
1196 Draft21 => crate::draft21::data_stream::DatagramHeader,
1197 #[cfg(feature = "draft22")]
1198 Draft22 => crate::draft22::data_stream::DatagramHeader,
1199 #[cfg(feature = "draft23")]
1200 Draft23 => crate::draft23::data_stream::DatagramHeader,
1201 }
1202 decode(decode);
1203 encode(encode_checked -> Result<(), CodecError>);
1204}
1205
1206#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1220pub struct AnyDatagramMeta {
1221 pub track_alias: u64,
1223 pub group_id: u64,
1225 pub object_id: u64,
1237 pub publisher_priority: Option<u8>,
1245 pub status: Option<u64>,
1258}
1259
1260impl AnyDatagramHeader {
1261 #[allow(unreachable_patterns)]
1272 pub fn meta(&self) -> AnyDatagramMeta {
1273 #[cfg(any(
1282 feature = "draft09",
1283 feature = "draft10",
1284 feature = "draft11",
1285 feature = "draft12",
1286 feature = "draft13"
1287 ))]
1288 macro_rules! split_datagram {
1289 ($module:ident, $value:expr) => {
1290 match $value {
1291 crate::$module::data_stream::Datagram::Payload(h) => AnyDatagramMeta {
1292 track_alias: h.track_alias.into_inner(),
1293 group_id: h.group_id.into_inner(),
1294 object_id: h.object_id.into_inner(),
1295 publisher_priority: Some(h.publisher_priority),
1296 status: None,
1297 },
1298 crate::$module::data_stream::Datagram::Status(h) => AnyDatagramMeta {
1299 track_alias: h.track_alias.into_inner(),
1300 group_id: h.group_id.into_inner(),
1301 object_id: h.object_id.into_inner(),
1302 publisher_priority: Some(h.publisher_priority),
1303 status: Some(h.object_status.as_u64()),
1304 },
1305 }
1306 };
1307 }
1308
1309 match self {
1310 #[cfg(feature = "draft07")]
1320 AnyDatagramHeader::Draft07(d) => {
1321 let states_status = d.is_status();
1322 match d {
1323 crate::draft07::data_stream::Datagram::Payload(h) => AnyDatagramMeta {
1324 track_alias: h.track_alias.into_inner(),
1325 group_id: h.group_id.into_inner(),
1326 object_id: h.object_id.into_inner(),
1327 publisher_priority: Some(h.publisher_priority),
1328 status: states_status.then(|| h.object_status.as_u64()),
1329 },
1330 }
1331 }
1332 #[cfg(feature = "draft08")]
1333 AnyDatagramHeader::Draft08(d) => {
1334 let states_status = d.is_status();
1335 match d {
1336 crate::draft08::data_stream::Datagram::Payload(h) => AnyDatagramMeta {
1337 track_alias: h.track_alias.into_inner(),
1338 group_id: h.group_id.into_inner(),
1339 object_id: h.object_id.into_inner(),
1340 publisher_priority: Some(h.publisher_priority),
1341 status: states_status.then(|| h.object_status.as_u64()),
1342 },
1343 crate::draft08::data_stream::Datagram::Status(h) => AnyDatagramMeta {
1344 track_alias: h.track_alias.into_inner(),
1345 group_id: h.group_id.into_inner(),
1346 object_id: h.object_id.into_inner(),
1347 publisher_priority: Some(h.publisher_priority),
1348 status: Some(h.object_status.as_u64()),
1349 },
1350 }
1351 }
1352 #[cfg(feature = "draft09")]
1353 AnyDatagramHeader::Draft09(d) => split_datagram!(draft09, d),
1354 #[cfg(feature = "draft10")]
1355 AnyDatagramHeader::Draft10(d) => split_datagram!(draft10, d),
1356 #[cfg(feature = "draft11")]
1357 AnyDatagramHeader::Draft11(d) => split_datagram!(draft11, d),
1358 #[cfg(feature = "draft12")]
1359 AnyDatagramHeader::Draft12(d) => split_datagram!(draft12, d),
1360 #[cfg(feature = "draft13")]
1361 AnyDatagramHeader::Draft13(d) => split_datagram!(draft13, d),
1362 #[cfg(feature = "draft14")]
1363 AnyDatagramHeader::Draft14(d) => AnyDatagramMeta {
1364 track_alias: d.track_alias.into_inner(),
1365 group_id: d.group_id.into_inner(),
1366 object_id: d.object_id.into_inner(),
1367 publisher_priority: Some(d.publisher_priority),
1368 status: d.status.map(|s| s.as_u64()),
1369 },
1370 #[cfg(feature = "draft15")]
1375 AnyDatagramHeader::Draft15(d) => AnyDatagramMeta {
1376 track_alias: d.track_alias.into_inner(),
1377 group_id: d.group_id.into_inner(),
1378 object_id: d.object_id.into_inner(),
1379 publisher_priority: d.publisher_priority,
1380 status: d.is_status().then(|| {
1381 d.object_status.unwrap_or(crate::draft15::types::ObjectStatus::Normal).as_u64()
1382 }),
1383 },
1384 #[cfg(feature = "draft16")]
1385 AnyDatagramHeader::Draft16(d) => AnyDatagramMeta {
1386 track_alias: d.track_alias.into_inner(),
1387 group_id: d.group_id.into_inner(),
1388 object_id: d.object_id.into_inner(),
1389 publisher_priority: d.publisher_priority,
1390 status: d.is_status().then(|| {
1391 d.object_status.unwrap_or(crate::draft16::types::ObjectStatus::Normal).as_u64()
1392 }),
1393 },
1394 #[cfg(feature = "draft17")]
1396 AnyDatagramHeader::Draft17(d) => AnyDatagramMeta {
1397 track_alias: d.track_alias.into_inner(),
1398 group_id: d.group_id.into_inner(),
1399 object_id: d.object_id.into_inner(),
1400 publisher_priority: d.publisher_priority,
1401 status: d.has_status().then(|| d.status().as_u64()),
1402 },
1403 #[cfg(feature = "draft18")]
1404 AnyDatagramHeader::Draft18(d) => AnyDatagramMeta {
1405 track_alias: d.track_alias.into_inner(),
1406 group_id: d.group_id.into_inner(),
1407 object_id: d.object_id.into_inner(),
1408 publisher_priority: d.publisher_priority,
1409 status: d.has_status().then(|| d.status().as_u64()),
1410 },
1411 #[cfg(feature = "draft19")]
1412 AnyDatagramHeader::Draft19(d) => AnyDatagramMeta {
1413 track_alias: d.track_alias.into_inner(),
1414 group_id: d.group_id.into_inner(),
1415 object_id: d.object_id.into_inner(),
1416 publisher_priority: d.publisher_priority,
1417 status: d.has_status().then(|| d.status().as_u64()),
1418 },
1419 #[cfg(feature = "draft20")]
1420 AnyDatagramHeader::Draft20(d) => AnyDatagramMeta {
1421 track_alias: d.track_alias.into_inner(),
1422 group_id: d.group_id.into_inner(),
1423 object_id: d.object_id.into_inner(),
1424 publisher_priority: d.publisher_priority,
1425 status: d.has_status().then(|| d.status().as_u64()),
1426 },
1427 #[cfg(feature = "draft21")]
1428 AnyDatagramHeader::Draft21(d) => AnyDatagramMeta {
1429 track_alias: d.track_alias.into_inner(),
1430 group_id: d.group_id.into_inner(),
1431 object_id: d.object_id.into_inner(),
1432 publisher_priority: d.publisher_priority,
1433 status: d.has_status().then(|| d.status().as_u64()),
1434 },
1435 #[cfg(feature = "draft22")]
1436 AnyDatagramHeader::Draft22(d) => AnyDatagramMeta {
1437 track_alias: d.track_alias.into_inner(),
1438 group_id: d.group_id.into_inner(),
1439 object_id: d.object_id.into_inner(),
1440 publisher_priority: d.publisher_priority,
1441 status: d.has_status().then(|| d.status().as_u64()),
1442 },
1443 #[cfg(feature = "draft23")]
1444 AnyDatagramHeader::Draft23(d) => AnyDatagramMeta {
1445 track_alias: d.track_alias.into_inner(),
1446 group_id: d.group_id.into_inner(),
1447 object_id: d.object_id.into_inner(),
1448 publisher_priority: d.publisher_priority,
1449 status: d.has_status().then(|| d.status().as_u64()),
1450 },
1451 _ => unreachable!("AnyDatagramHeader has no enabled variants"),
1452 }
1453 }
1454
1455 #[allow(unreachable_patterns)]
1474 pub fn permits_payload(&self) -> bool {
1475 match self {
1476 #[cfg(feature = "draft07")]
1477 AnyDatagramHeader::Draft07(d) => !d.is_status(),
1478 #[cfg(feature = "draft08")]
1479 AnyDatagramHeader::Draft08(d) => !d.is_status(),
1480 #[cfg(feature = "draft09")]
1481 AnyDatagramHeader::Draft09(d) => !d.is_status(),
1482 #[cfg(feature = "draft10")]
1483 AnyDatagramHeader::Draft10(d) => !d.is_status(),
1484 #[cfg(feature = "draft11")]
1485 AnyDatagramHeader::Draft11(d) => !d.is_status(),
1486 #[cfg(feature = "draft12")]
1487 AnyDatagramHeader::Draft12(d) => !d.is_status(),
1488 #[cfg(feature = "draft13")]
1489 AnyDatagramHeader::Draft13(d) => !d.is_status(),
1490 #[cfg(feature = "draft14")]
1491 AnyDatagramHeader::Draft14(d) => !d.datagram_type.is_status(),
1492 #[cfg(feature = "draft15")]
1493 AnyDatagramHeader::Draft15(d) => !d.is_status(),
1494 #[cfg(feature = "draft16")]
1495 AnyDatagramHeader::Draft16(d) => !d.is_status(),
1496 #[cfg(feature = "draft17")]
1499 AnyDatagramHeader::Draft17(d) => d.permits_payload(),
1500 #[cfg(feature = "draft18")]
1501 AnyDatagramHeader::Draft18(d) => d.permits_payload(),
1502 #[cfg(feature = "draft19")]
1503 AnyDatagramHeader::Draft19(d) => d.permits_payload(),
1504 #[cfg(feature = "draft20")]
1505 AnyDatagramHeader::Draft20(d) => d.permits_payload(),
1506 #[cfg(feature = "draft21")]
1507 AnyDatagramHeader::Draft21(d) => d.permits_payload(),
1508 #[cfg(feature = "draft22")]
1509 AnyDatagramHeader::Draft22(d) => d.permits_payload(),
1510 #[cfg(feature = "draft23")]
1511 AnyDatagramHeader::Draft23(d) => d.permits_payload(),
1512 _ => unreachable!("AnyDatagramHeader has no enabled variants"),
1513 }
1514 }
1515
1516 #[allow(unreachable_patterns)]
1548 pub fn extensions_permitted(&self) -> Option<bool> {
1549 match self {
1550 #[cfg(feature = "draft07")]
1552 AnyDatagramHeader::Draft07(_) => None,
1553 #[cfg(feature = "draft08")]
1554 AnyDatagramHeader::Draft08(_) => None,
1555 #[cfg(feature = "draft09")]
1556 AnyDatagramHeader::Draft09(_) => None,
1557 #[cfg(feature = "draft10")]
1558 AnyDatagramHeader::Draft10(_) => None,
1559 #[cfg(feature = "draft11")]
1562 AnyDatagramHeader::Draft11(d) => Some(match d {
1563 crate::draft11::data_stream::Datagram::Payload(_) => true,
1564 crate::draft11::data_stream::Datagram::Status(s) => {
1565 s.extensions.is_empty()
1566 || s.object_status
1567 != crate::draft11::types::ObjectStatus::ObjectDoesNotExist
1568 }
1569 }),
1570 #[cfg(feature = "draft12")]
1571 AnyDatagramHeader::Draft12(d) => Some(match d {
1572 crate::draft12::data_stream::Datagram::Payload(_) => true,
1573 crate::draft12::data_stream::Datagram::Status(s) => {
1574 s.extensions.is_empty()
1575 || s.object_status
1576 != crate::draft12::types::ObjectStatus::ObjectDoesNotExist
1577 }
1578 }),
1579 #[cfg(feature = "draft13")]
1580 AnyDatagramHeader::Draft13(d) => Some(match d {
1581 crate::draft13::data_stream::Datagram::Payload(_) => true,
1582 crate::draft13::data_stream::Datagram::Status(s) => {
1583 s.extensions.is_empty()
1584 || s.object_status
1585 != crate::draft13::types::ObjectStatus::ObjectDoesNotExist
1586 }
1587 }),
1588 #[cfg(feature = "draft14")]
1591 AnyDatagramHeader::Draft14(d) => Some(
1592 d.extension_headers.is_empty()
1593 || d.status != Some(crate::draft14::types::ObjectStatus::ObjectDoesNotExist),
1594 ),
1595 #[cfg(feature = "draft15")]
1597 AnyDatagramHeader::Draft15(d) => Some(d.extensions_permitted()),
1598 #[cfg(feature = "draft16")]
1599 AnyDatagramHeader::Draft16(d) => Some(d.extensions_permitted()),
1600 #[cfg(feature = "draft17")]
1601 AnyDatagramHeader::Draft17(d) => Some(d.properties_permitted()),
1602 #[cfg(feature = "draft18")]
1603 AnyDatagramHeader::Draft18(d) => Some(d.properties_permitted()),
1604 #[cfg(feature = "draft19")]
1605 AnyDatagramHeader::Draft19(d) => Some(d.properties_permitted()),
1606 #[cfg(feature = "draft20")]
1607 AnyDatagramHeader::Draft20(d) => Some(d.properties_permitted()),
1608 #[cfg(feature = "draft21")]
1609 AnyDatagramHeader::Draft21(d) => Some(d.properties_permitted()),
1610 #[cfg(feature = "draft22")]
1611 AnyDatagramHeader::Draft22(d) => Some(d.properties_permitted()),
1612 #[cfg(feature = "draft23")]
1613 AnyDatagramHeader::Draft23(d) => Some(d.properties_permitted()),
1614 _ => unreachable!("AnyDatagramHeader has no enabled variants"),
1615 }
1616 }
1617}
1618
1619dispatch_enum! {
1620 #[derive(Debug, Clone)]
1625 pub enum AnyFetchHeader {
1626 #[cfg(feature = "draft07")]
1627 Draft07 => crate::draft07::data_stream::FetchHeader,
1628 #[cfg(feature = "draft08")]
1629 Draft08 => crate::draft08::data_stream::FetchHeader,
1630 #[cfg(feature = "draft09")]
1631 Draft09 => crate::draft09::data_stream::FetchHeader,
1632 #[cfg(feature = "draft10")]
1633 Draft10 => crate::draft10::data_stream::FetchHeader,
1634 #[cfg(feature = "draft11")]
1635 Draft11 => crate::draft11::data_stream::FetchHeader,
1636 #[cfg(feature = "draft12")]
1637 Draft12 => crate::draft12::data_stream::FetchHeader,
1638 #[cfg(feature = "draft13")]
1639 Draft13 => crate::draft13::data_stream::FetchHeader,
1640 #[cfg(feature = "draft14")]
1641 Draft14 => crate::draft14::data_stream::FetchHeader,
1642 #[cfg(feature = "draft15")]
1643 Draft15 => crate::draft15::data_stream::FetchHeader,
1644 #[cfg(feature = "draft16")]
1645 Draft16 => crate::draft16::data_stream::FetchHeader,
1646 #[cfg(feature = "draft17")]
1647 Draft17 => crate::draft17::data_stream::FetchHeader,
1648 #[cfg(feature = "draft18")]
1649 Draft18 => crate::draft18::data_stream::FetchHeader,
1650 #[cfg(feature = "draft19")]
1651 Draft19 => crate::draft19::data_stream::FetchHeader,
1652 #[cfg(feature = "draft20")]
1653 Draft20 => crate::draft20::data_stream::FetchHeader,
1654 #[cfg(feature = "draft21")]
1655 Draft21 => crate::draft21::data_stream::FetchHeader,
1656 #[cfg(feature = "draft22")]
1657 Draft22 => crate::draft22::data_stream::FetchHeader,
1658 #[cfg(feature = "draft23")]
1659 Draft23 => crate::draft23::data_stream::FetchHeader,
1660 }
1661 decode(decode);
1662 encode(encode -> ());
1663}
1664
1665impl AnyFetchHeader {
1666 #[allow(unreachable_patterns)]
1680 pub fn request_id(&self) -> u64 {
1681 match self {
1682 #[cfg(feature = "draft07")]
1683 AnyFetchHeader::Draft07(h) => h.subscribe_id.into_inner(),
1684 #[cfg(feature = "draft08")]
1685 AnyFetchHeader::Draft08(h) => h.subscribe_id.into_inner(),
1686 #[cfg(feature = "draft09")]
1687 AnyFetchHeader::Draft09(h) => h.subscribe_id.into_inner(),
1688 #[cfg(feature = "draft10")]
1689 AnyFetchHeader::Draft10(h) => h.subscribe_id.into_inner(),
1690 #[cfg(feature = "draft11")]
1691 AnyFetchHeader::Draft11(h) => h.request_id.into_inner(),
1692 #[cfg(feature = "draft12")]
1693 AnyFetchHeader::Draft12(h) => h.request_id.into_inner(),
1694 #[cfg(feature = "draft13")]
1695 AnyFetchHeader::Draft13(h) => h.request_id.into_inner(),
1696 #[cfg(feature = "draft14")]
1697 AnyFetchHeader::Draft14(h) => h.request_id.into_inner(),
1698 #[cfg(feature = "draft15")]
1699 AnyFetchHeader::Draft15(h) => h.request_id.into_inner(),
1700 #[cfg(feature = "draft16")]
1701 AnyFetchHeader::Draft16(h) => h.request_id.into_inner(),
1702 #[cfg(feature = "draft17")]
1703 AnyFetchHeader::Draft17(h) => h.request_id.into_inner(),
1704 #[cfg(feature = "draft18")]
1705 AnyFetchHeader::Draft18(h) => h.request_id.into_inner(),
1706 #[cfg(feature = "draft19")]
1707 AnyFetchHeader::Draft19(h) => h.request_id.into_inner(),
1708 #[cfg(feature = "draft20")]
1709 AnyFetchHeader::Draft20(h) => h.request_id.into_inner(),
1710 #[cfg(feature = "draft21")]
1711 AnyFetchHeader::Draft21(h) => h.request_id.into_inner(),
1712 #[cfg(feature = "draft22")]
1713 AnyFetchHeader::Draft22(h) => h.request_id.into_inner(),
1714 #[cfg(feature = "draft23")]
1715 AnyFetchHeader::Draft23(h) => h.request_id.into_inner(),
1716 _ => unreachable!("AnyFetchHeader has no enabled variants"),
1717 }
1718 }
1719
1720 #[allow(unreachable_code, unused_variables)]
1726 pub fn encode_stream(&self, buf: &mut impl BufMut) {
1727 match self {
1728 #[cfg(feature = "draft07")]
1729 AnyFetchHeader::Draft07(h) => h.encode_stream(buf),
1730 #[cfg(feature = "draft08")]
1731 AnyFetchHeader::Draft08(h) => h.encode_stream(buf),
1732 #[cfg(feature = "draft09")]
1733 AnyFetchHeader::Draft09(h) => h.encode_stream(buf),
1734 #[cfg(feature = "draft10")]
1735 AnyFetchHeader::Draft10(h) => h.encode_stream(buf),
1736 #[cfg(feature = "draft11")]
1737 AnyFetchHeader::Draft11(h) => h.encode_stream(buf),
1738 #[cfg(feature = "draft12")]
1739 AnyFetchHeader::Draft12(h) => h.encode_stream(buf),
1740 #[cfg(feature = "draft13")]
1741 AnyFetchHeader::Draft13(h) => h.encode_stream(buf),
1742 #[cfg(feature = "draft14")]
1746 AnyFetchHeader::Draft14(h) => h.encode(buf),
1747 #[cfg(feature = "draft15")]
1748 AnyFetchHeader::Draft15(h) => h.encode(buf),
1749 #[cfg(feature = "draft16")]
1750 AnyFetchHeader::Draft16(h) => h.encode(buf),
1751 #[cfg(feature = "draft17")]
1752 AnyFetchHeader::Draft17(h) => h.encode(buf),
1753 #[cfg(feature = "draft18")]
1754 AnyFetchHeader::Draft18(h) => h.encode(buf),
1755 #[cfg(feature = "draft19")]
1756 AnyFetchHeader::Draft19(h) => h.encode(buf),
1757 #[cfg(feature = "draft20")]
1758 AnyFetchHeader::Draft20(h) => h.encode(buf),
1759 #[cfg(feature = "draft21")]
1760 AnyFetchHeader::Draft21(h) => h.encode(buf),
1761 #[cfg(feature = "draft22")]
1762 AnyFetchHeader::Draft22(h) => h.encode(buf),
1763 #[cfg(feature = "draft23")]
1764 AnyFetchHeader::Draft23(h) => h.encode(buf),
1765 #[allow(unreachable_patterns)]
1766 _ => unreachable!("AnyFetchHeader has no enabled variants"),
1767 }
1768 }
1769
1770 #[allow(unused_variables)]
1772 pub fn decode_stream(version: DraftVersion, buf: &mut impl Buf) -> Result<Self, CodecError> {
1773 match version {
1774 #[cfg(feature = "draft07")]
1775 DraftVersion::Draft07 => crate::draft07::data_stream::FetchHeader::decode_stream(buf)
1776 .map(AnyFetchHeader::Draft07),
1777 #[cfg(feature = "draft08")]
1778 DraftVersion::Draft08 => crate::draft08::data_stream::FetchHeader::decode_stream(buf)
1779 .map(AnyFetchHeader::Draft08),
1780 #[cfg(feature = "draft09")]
1781 DraftVersion::Draft09 => crate::draft09::data_stream::FetchHeader::decode_stream(buf)
1782 .map(AnyFetchHeader::Draft09),
1783 #[cfg(feature = "draft10")]
1784 DraftVersion::Draft10 => crate::draft10::data_stream::FetchHeader::decode_stream(buf)
1785 .map(AnyFetchHeader::Draft10),
1786 #[cfg(feature = "draft11")]
1787 DraftVersion::Draft11 => crate::draft11::data_stream::FetchHeader::decode_stream(buf)
1788 .map(AnyFetchHeader::Draft11),
1789 #[cfg(feature = "draft12")]
1790 DraftVersion::Draft12 => crate::draft12::data_stream::FetchHeader::decode_stream(buf)
1791 .map(AnyFetchHeader::Draft12),
1792 #[cfg(feature = "draft13")]
1793 DraftVersion::Draft13 => crate::draft13::data_stream::FetchHeader::decode_stream(buf)
1794 .map(AnyFetchHeader::Draft13),
1795 #[cfg(feature = "draft14")]
1796 DraftVersion::Draft14 => {
1797 crate::draft14::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft14)
1798 }
1799 #[cfg(feature = "draft15")]
1800 DraftVersion::Draft15 => {
1801 crate::draft15::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft15)
1802 }
1803 #[cfg(feature = "draft16")]
1804 DraftVersion::Draft16 => {
1805 crate::draft16::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft16)
1806 }
1807 #[cfg(feature = "draft17")]
1808 DraftVersion::Draft17 => {
1809 crate::draft17::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft17)
1810 }
1811 #[cfg(feature = "draft18")]
1812 DraftVersion::Draft18 => {
1813 crate::draft18::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft18)
1814 }
1815 #[cfg(feature = "draft19")]
1816 DraftVersion::Draft19 => {
1817 crate::draft19::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft19)
1818 }
1819 #[cfg(feature = "draft20")]
1820 DraftVersion::Draft20 => {
1821 crate::draft20::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft20)
1822 }
1823 #[cfg(feature = "draft21")]
1824 DraftVersion::Draft21 => {
1825 crate::draft21::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft21)
1826 }
1827 #[cfg(feature = "draft22")]
1828 DraftVersion::Draft22 => {
1829 crate::draft22::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft22)
1830 }
1831 #[cfg(feature = "draft23")]
1832 DraftVersion::Draft23 => {
1833 crate::draft23::data_stream::FetchHeader::decode(buf).map(AnyFetchHeader::Draft23)
1834 }
1835 #[allow(unreachable_patterns)]
1836 _ => Err(CodecError::UnsupportedDraft(format!(
1837 "draft {version:?} not enabled via feature flag"
1838 ))),
1839 }
1840 }
1841}
1842
1843#[cfg(all(test, any(feature = "draft07", feature = "draft12", feature = "draft18")))]
1848mod tests {
1849 use super::*;
1850
1851 #[test]
1867 fn any_datagram_header_encode_refuses_what_the_framing_cannot_carry() {
1868 #[cfg(feature = "draft07")]
1869 {
1870 let header =
1871 AnyDatagramHeader::Draft07(crate::draft07::data_stream::Datagram::Payload(
1872 crate::draft07::data_stream::DatagramHeader {
1873 track_alias: crate::varint::VarInt::from_usize(1),
1874 group_id: crate::varint::VarInt::from_usize(0),
1875 object_id: crate::varint::VarInt::from_usize(0),
1876 publisher_priority: 128,
1877 object_status: crate::draft07::types::ObjectStatus::EndOfGroup,
1878 payload_length: crate::varint::VarInt::from_usize(4),
1879 },
1880 ));
1881 let mut buf = Vec::new();
1882 let result = header.encode(&mut buf);
1883 assert!(
1884 matches!(result, Err(CodecError::InvalidField)),
1885 "draft-07 must refuse a status its framing cannot carry; got {result:?}"
1886 );
1887 assert!(buf.is_empty(), "draft-07 wrote {buf:?} for a header it refused");
1888 }
1889
1890 #[cfg(feature = "draft18")]
1891 {
1892 let header = AnyDatagramHeader::Draft18(crate::draft18::data_stream::DatagramHeader {
1893 datagram_type: 0x00,
1896 track_alias: crate::varint::VarInt::from_usize(1),
1897 group_id: crate::varint::VarInt::from_usize(0),
1898 object_id: crate::varint::VarInt::from_usize(0),
1899 publisher_priority: Some(128),
1900 properties: Vec::new(),
1901 object_status: Some(crate::draft18::types::ObjectStatus::EndOfGroup),
1902 });
1903 let mut buf = Vec::new();
1904 let result = header.encode(&mut buf);
1905 assert!(
1906 matches!(result, Err(CodecError::InvalidField)),
1907 "draft-18 must refuse a status its framing cannot carry; got {result:?}"
1908 );
1909 assert!(buf.is_empty(), "draft-18 wrote {buf:?} for a header it refused");
1910 }
1911
1912 #[cfg(feature = "draft12")]
1913 {
1914 let header =
1915 AnyDatagramHeader::Draft12(crate::draft12::data_stream::Datagram::Payload(
1916 crate::draft12::data_stream::DatagramHeader {
1917 track_alias: crate::varint::VarInt::from_usize(1),
1918 group_id: crate::varint::VarInt::from_usize(0),
1919 object_id: crate::varint::VarInt::from_usize(7),
1920 publisher_priority: 128,
1921 extension_headers_length: crate::varint::VarInt::from_usize(0),
1922 extensions: Vec::new(),
1923 end_of_group: false,
1924 },
1925 ));
1926 let mut buf = Vec::new();
1927 header
1928 .encode(&mut buf)
1929 .expect("draft-12's payload datagram carries no status to refuse");
1930 let mut cursor = &buf[..];
1931 let decoded = AnyDatagramHeader::decode(DraftVersion::Draft12, &mut cursor)
1932 .expect("the bytes the dispatch layer wrote must parse back");
1933 assert_eq!(decoded.draft(), DraftVersion::Draft12);
1934 assert!(!cursor.has_remaining(), "draft-12 left {cursor:?} unread");
1935 }
1936 }
1937
1938 #[test]
1949 fn any_datagram_header_reports_payload_and_extension_permission() {
1950 #[cfg(feature = "draft07")]
1951 {
1952 let status =
1953 AnyDatagramHeader::Draft07(crate::draft07::data_stream::Datagram::Payload(
1954 crate::draft07::data_stream::DatagramHeader {
1955 track_alias: crate::varint::VarInt::from_usize(1),
1956 group_id: crate::varint::VarInt::from_usize(0),
1957 object_id: crate::varint::VarInt::from_usize(0),
1958 publisher_priority: 128,
1959 object_status: crate::draft07::types::ObjectStatus::EndOfGroup,
1960 payload_length: crate::varint::VarInt::from_usize(0),
1963 },
1964 ));
1965 assert!(
1966 !status.permits_payload(),
1967 "draft-07 declares no payload bytes, so it may not carry any",
1968 );
1969 assert_eq!(
1970 status.extensions_permitted(),
1971 None,
1972 "draft-07 has no extension block and states no rule about one",
1973 );
1974 }
1975
1976 #[cfg(feature = "draft12")]
1977 {
1978 let with_extensions = |object_status| {
1979 AnyDatagramHeader::Draft12(crate::draft12::data_stream::Datagram::Status(
1980 crate::draft12::data_stream::DatagramStatusHeader {
1981 track_alias: crate::varint::VarInt::from_usize(1),
1982 group_id: crate::varint::VarInt::from_usize(0),
1983 object_id: crate::varint::VarInt::from_usize(0),
1984 publisher_priority: 128,
1985 extension_headers_length: crate::varint::VarInt::from_usize(2),
1986 extensions: vec![0x3c, 0x01],
1987 object_status,
1988 },
1989 ))
1990 };
1991
1992 let absent = with_extensions(crate::draft12::types::ObjectStatus::ObjectDoesNotExist);
1993 assert!(!absent.permits_payload(), "a status datagram carries no payload");
1994 assert_eq!(
1995 absent.extensions_permitted(),
1996 Some(false),
1997 "Object Does Not Exist is the one status draft-12 bars extensions from",
1998 );
1999
2000 let end_of_group = with_extensions(crate::draft12::types::ObjectStatus::EndOfGroup);
2001 assert_eq!(
2002 end_of_group.extensions_permitted(),
2003 Some(true),
2004 "draft-12 states the narrow form, which leaves End of Group free to \
2005 carry extensions: expected Some(true), got {:?}",
2006 end_of_group.extensions_permitted(),
2007 );
2008 }
2009
2010 #[cfg(feature = "draft18")]
2011 {
2012 let header = |object_status| {
2014 AnyDatagramHeader::Draft18(crate::draft18::data_stream::DatagramHeader {
2015 datagram_type: 0x21,
2016 track_alias: crate::varint::VarInt::from_usize(1),
2017 group_id: crate::varint::VarInt::from_usize(0),
2018 object_id: crate::varint::VarInt::from_usize(0),
2019 publisher_priority: Some(128),
2020 properties: vec![0x3c, 0x01],
2021 object_status: Some(object_status),
2022 })
2023 };
2024
2025 let end_of_group = header(crate::draft18::types::ObjectStatus::EndOfGroup);
2026 assert!(!end_of_group.permits_payload(), "a status datagram carries no payload");
2027 assert_eq!(
2028 end_of_group.extensions_permitted(),
2029 Some(false),
2030 "draft-18 states the general form, which bars properties beside any \
2031 status that is not Normal",
2032 );
2033 }
2034 }
2035}