rtc_dtls/
compression_methods.rs1use shared::error::Result;
2
3use byteorder::{ReadBytesExt, WriteBytesExt};
4use std::io::{Read, Write};
5
6#[derive(Copy, Clone, Debug, PartialEq, Eq)]
7pub enum CompressionMethodId {
9 Null = 0,
11 Unsupported,
13}
14
15impl From<u8> for CompressionMethodId {
16 fn from(val: u8) -> Self {
17 match val {
18 0 => CompressionMethodId::Null,
19 _ => CompressionMethodId::Unsupported,
20 }
21 }
22}
23
24#[derive(Clone, Debug, PartialEq, Eq)]
25pub struct CompressionMethods {
27 pub ids: Vec<CompressionMethodId>,
29}
30
31impl CompressionMethods {
32 pub fn size(&self) -> usize {
34 1 + self.ids.len()
35 }
36
37 pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
43 writer.write_u8(self.ids.len() as u8)?;
44
45 for id in &self.ids {
46 writer.write_u8(*id as u8)?;
47 }
48
49 Ok(writer.flush()?)
50 }
51
52 pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
58 let compression_methods_count = reader.read_u8()? as usize;
59 let mut ids = vec![];
60 for _ in 0..compression_methods_count {
61 let id = reader.read_u8()?.into();
62 if id != CompressionMethodId::Unsupported {
63 ids.push(id);
64 }
65 }
66
67 Ok(CompressionMethods { ids })
68 }
69}
70
71pub fn default_compression_methods() -> CompressionMethods {
73 CompressionMethods {
74 ids: vec![CompressionMethodId::Null],
75 }
76}