smpp_codec/pdus/session_pdus/enquirelink_request.rs
1use crate::common::{PduError, CMD_ENQUIRE_LINK, HEADER_LEN};
2use std::io::{Cursor, Read, Write};
3
4// --- EnquireLink Request ---
5/// Represents an Enquire Link PDU.
6///
7/// Used to check the health of the connection.
8#[derive(Debug, Clone)]
9pub struct EnquireLinkRequest {
10 pub sequence_number: u32,
11}
12
13impl EnquireLinkRequest {
14 /// Create a new Enquire Link Request.
15 ///
16 /// # Examples
17 ///
18 /// ```
19 /// use smpp_codec::pdus::EnquireLinkRequest;
20 ///
21 /// let sequence_number: u32 = 1;
22 /// let enquire_link = EnquireLinkRequest::new(sequence_number);
23 /// ```
24 pub fn new(sequence_number: u32) -> Self {
25 Self { sequence_number }
26 }
27
28 /// Encode the struct into raw bytes for the network.
29 ///
30 /// # Errors
31 ///
32 /// Returns a [`PduError`] if an I/O error occurs while writing.
33 ///
34 /// # Examples
35 ///
36 /// ```
37 /// # use smpp_codec::pdus::EnquireLinkRequest;
38 /// # let sequence_number: u32 = 1;
39 /// # let enquire_link = EnquireLinkRequest::new(sequence_number);
40 /// let mut buffer = Vec::new();
41 /// enquire_link.encode(&mut buffer).expect("Encoding failed");
42 /// ```
43 pub fn encode(&self, writer: &mut impl Write) -> Result<(), PduError> {
44 let command_len = HEADER_LEN as u32;
45 writer.write_all(&command_len.to_be_bytes())?;
46 writer.write_all(&CMD_ENQUIRE_LINK.to_be_bytes())?;
47 writer.write_all(&0u32.to_be_bytes())?; // Status always 0
48 writer.write_all(&self.sequence_number.to_be_bytes())?;
49 Ok(())
50 }
51
52 /// Decode raw bytes from the network into the struct.
53 ///
54 /// # Errors
55 ///
56 /// Returns a [`PduError`] if the buffer is too short.
57 ///
58 /// # Examples
59 ///
60 /// ```
61 /// # use smpp_codec::pdus::EnquireLinkRequest;
62 /// # let sequence_number: u32 = 1;
63 /// # let enquire_link = EnquireLinkRequest::new(sequence_number);
64 /// # let mut buffer = Vec::new();
65 /// # enquire_link.encode(&mut buffer).unwrap();
66 /// let decoded = EnquireLinkRequest::decode(&buffer).expect("Decoding failed");
67 /// assert_eq!(decoded.sequence_number, 1);
68 /// ```
69 pub fn decode(buffer: &[u8]) -> Result<Self, PduError> {
70 if buffer.len() < HEADER_LEN {
71 return Err(PduError::BufferTooShort);
72 }
73 let mut cursor = Cursor::new(buffer);
74 cursor.set_position(12); // Skip len, id, status
75
76 let mut bytes = [0u8; 4];
77 cursor.read_exact(&mut bytes)?;
78 let sequence_number = u32::from_be_bytes(bytes);
79
80 Ok(Self { sequence_number })
81 }
82}