Skip to main content

c_its_parser/transport/
encode.rs

1use alloc::string::ToString;
2
3use super::{BasicTransportAHeader, BasicTransportBHeader, Debug, IPv6Header};
4
5#[allow(dead_code)]
6#[derive(Debug)]
7pub enum EncodeError {
8    Unsupported(alloc::string::String),
9    #[cfg(feature = "json")]
10    Json(alloc::string::String),
11}
12
13pub trait Encode: Sized {
14    fn encode(&self) -> Result<alloc::vec::Vec<u8>, EncodeError>;
15}
16
17impl Encode for BasicTransportAHeader {
18    fn encode(&self) -> Result<alloc::vec::Vec<u8>, EncodeError> {
19        Ok([
20            self.destination_port.to_be_bytes(),
21            self.source_port.to_be_bytes(),
22        ]
23        .concat())
24    }
25}
26
27impl BasicTransportAHeader {
28    #[cfg(feature = "json")]
29    /// Encodes a BTP-A as a JSON representation
30    ///
31    /// # Errors
32    /// Returns an error when encoding failed.
33    pub fn encode_to_json(&self) -> Result<alloc::string::String, EncodeError> {
34        serde_json::to_string(&self)
35            .map_err(|e| EncodeError::Json(alloc::format!("Error encoding to JSON: {e:?}")))
36    }
37}
38
39impl Encode for BasicTransportBHeader {
40    fn encode(&self) -> Result<alloc::vec::Vec<u8>, EncodeError> {
41        Ok([
42            self.destination_port.to_be_bytes(),
43            self.destination_port_info.to_be_bytes(),
44        ]
45        .concat())
46    }
47}
48
49impl BasicTransportBHeader {
50    #[cfg(feature = "json")]
51    /// Encodes a BTP-B as a JSON representation
52    ///
53    /// # Errors
54    /// Returns an error when encoding failed.
55    pub fn encode_to_json(&self) -> Result<alloc::string::String, EncodeError> {
56        serde_json::to_string(&self)
57            .map_err(|e| EncodeError::Json(alloc::format!("Error encoding to JSON: {e:?}")))
58    }
59}
60
61impl Encode for IPv6Header {
62    fn encode(&self) -> Result<alloc::vec::Vec<u8>, EncodeError> {
63        Err(EncodeError::Unsupported(
64            "Encoding IPv6 headers is currently unsupported.".to_string(),
65        ))
66    }
67}