mls_spec/drafts/mls_extensions/
content_advertisement.rs1use super::safe_application::{Component, ComponentId, ComponentsList};
2
3#[derive(
4 Debug,
5 Clone,
6 PartialEq,
7 Eq,
8 tls_codec::TlsSerialize,
9 tls_codec::TlsDeserialize,
10 tls_codec::TlsSize,
11)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct Parameter {
14 #[tls_codec(with = "crate::tlspl::bytes")]
15 pub parameter_name: Vec<u8>,
16 #[tls_codec(with = "crate::tlspl::bytes")]
17 pub parameter_value: Vec<u8>,
18}
19
20#[derive(
21 Debug,
22 Clone,
23 PartialEq,
24 Eq,
25 tls_codec::TlsSerialize,
26 tls_codec::TlsDeserialize,
27 tls_codec::TlsSize,
28)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30pub struct MediaType {
31 #[tls_codec(with = "crate::tlspl::bytes")]
32 pub media_type: Vec<u8>,
33 pub parameters: Vec<Parameter>,
34}
35
36#[cfg(feature = "draft-ietf-mls-extensions-content-advertisement-parse")]
37impl MediaType {
38 pub fn to_parsed_repr(&self) -> crate::MlsSpecResult<mediatype::MediaType> {
39 let mt = std::str::from_utf8(&self.media_type)
40 .map_err(|_| crate::MlsSpecError::ContentAdvertisementUtf8ParameterError)?;
41
42 let mut mt_struct = mediatype::MediaType::parse(mt)?;
43 use mediatype::WriteParams as _;
44 for p in &self.parameters {
45 let name = std::str::from_utf8(p.parameter_name.as_slice())
46 .map_err(|_| crate::MlsSpecError::ContentAdvertisementUtf8ParameterError)
47 .and_then(|s| {
48 mediatype::Name::new(s)
49 .ok_or(crate::MlsSpecError::ContentAdvertisementUtf8ParameterError)
50 })?;
51
52 let value = std::str::from_utf8(p.parameter_value.as_slice())
53 .map_err(|_| crate::MlsSpecError::ContentAdvertisementUtf8ParameterError)
54 .and_then(|s| {
55 mediatype::Value::new(s)
56 .ok_or(crate::MlsSpecError::ContentAdvertisementUtf8ParameterError)
57 })?;
58
59 mt_struct.set_param(name, value);
60 }
61
62 Ok(mt_struct)
63 }
64}
65
66#[derive(
67 Debug,
68 Clone,
69 PartialEq,
70 Eq,
71 tls_codec::TlsSerialize,
72 tls_codec::TlsDeserialize,
73 tls_codec::TlsSize,
74)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76pub struct MediaTypeList {
77 pub media_types: Vec<MediaType>,
78}
79
80pub type AcceptedMediaTypes = MediaTypeList;
81pub type RequiredMediaTypes = MediaTypeList;
82
83#[derive(
84 Debug,
85 Clone,
86 PartialEq,
87 Eq,
88 tls_codec::TlsSerialize,
89 tls_codec::TlsDeserialize,
90 tls_codec::TlsSize,
91)]
92pub struct ContentMediaTypes(pub ComponentsList);
93
94impl Component for ContentMediaTypes {
95 fn component_id() -> ComponentId {
96 super::CONTENT_MEDIA_TYPES_ID
97 }
98}
99
100#[derive(
101 Debug,
102 Clone,
103 PartialEq,
104 Eq,
105 tls_codec::TlsSerialize,
106 tls_codec::TlsDeserialize,
107 tls_codec::TlsSize,
108)]
109#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
110pub struct ApplicationFraming {
111 pub media_type: MediaType,
112 #[tls_codec(with = "crate::tlspl::bytes")]
113 pub application_content: Vec<u8>,
114}