1use std::fmt;
2
3use super::Error;
4use bytes::Bytes;
5
6pub fn strip_padding(payload: &mut Bytes) -> Result<u8, Error> {
20 let payload_len = payload.len();
21 if payload_len == 0 {
22 return Err(Error::TooMuchPadding);
25 }
26
27 let pad_len = payload[0] as usize;
28
29 if pad_len >= payload_len {
30 return Err(Error::TooMuchPadding);
33 }
34
35 let _ = payload.split_to(1);
36 let _ = payload.split_off(payload_len - pad_len - 1);
37
38 Ok(pad_len as u8)
39}
40
41pub(super) fn debug_flags<'a, 'f: 'a>(
42 fmt: &'a mut fmt::Formatter<'f>,
43 bits: u8,
44) -> DebugFlags<'a, 'f> {
45 let result = write!(fmt, "({:#x}", bits);
46 DebugFlags {
47 fmt,
48 result,
49 started: false,
50 }
51}
52
53pub(super) struct DebugFlags<'a, 'f: 'a> {
54 fmt: &'a mut fmt::Formatter<'f>,
55 result: fmt::Result,
56 started: bool,
57}
58
59impl<'a, 'f: 'a> DebugFlags<'a, 'f> {
60 pub(super) fn flag_if(&mut self, enabled: bool, name: &str) -> &mut Self {
61 if enabled {
62 self.result = self.result.and_then(|()| {
63 let prefix = if self.started {
64 " | "
65 } else {
66 self.started = true;
67 ": "
68 };
69
70 write!(self.fmt, "{}{}", prefix, name)
71 });
72 }
73 self
74 }
75
76 pub(super) fn finish(&mut self) -> fmt::Result {
77 self.result.and_then(|()| write!(self.fmt, ")"))
78 }
79}