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