mls_spec/drafts/mls_extensions/
content_advertisement.rs

1use 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}