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}