Skip to main content

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