rusmpp_core/udhs/owned/
concatenation.rs

1//! Short message concatenation UDHs.
2
3mod concatenated_short_message_16_bit;
4pub use concatenated_short_message_16_bit::ConcatenatedShortMessage16Bit;
5
6mod concatenated_short_message_8_bit;
7pub use concatenated_short_message_8_bit::ConcatenatedShortMessage8Bit;
8
9pub mod parts {
10    pub use super::concatenated_short_message_8_bit::ConcatenatedShortMessage8BitParts;
11    pub use super::concatenated_short_message_16_bit::ConcatenatedShortMessage16BitParts;
12}
13
14/// Concatenated short message.
15#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
16pub enum ConcatenatedShortMessage {
17    /// 8-bit reference number concatenated short message.
18    EightBit(ConcatenatedShortMessage8Bit),
19    /// 16-bit reference number concatenated short message.
20    SixteenBit(ConcatenatedShortMessage16Bit),
21}
22
23impl ConcatenatedShortMessage {
24    /// Returns the length of the UDH type in bytes.
25    ///
26    /// See [`ConcatenatedShortMessageType::udh_length`].
27    pub const fn udh_length(&self) -> usize {
28        match self {
29            Self::EightBit(_) => ConcatenatedShortMessage8Bit::UDH_LENGTH,
30            Self::SixteenBit(_) => ConcatenatedShortMessage16Bit::UDH_LENGTH,
31        }
32    }
33
34    /// Converts [`ConcatenatedShortMessage`] to its UDH bytes representation.
35    pub const fn udh_bytes(&self) -> ConcatenatedShortMessageUdhBytes {
36        match self {
37            Self::EightBit(concatenation) => {
38                ConcatenatedShortMessageUdhBytes::EightBit(concatenation.udh_bytes())
39            }
40            Self::SixteenBit(concatenation) => {
41                ConcatenatedShortMessageUdhBytes::SixteenBit(concatenation.udh_bytes())
42            }
43        }
44    }
45}
46
47/// Bytes representation of [`ConcatenatedShortMessage`] as full UDH.
48#[derive(Debug)]
49pub enum ConcatenatedShortMessageUdhBytes {
50    /// 8-bit UDH bytes
51    EightBit([u8; 6]),
52    /// 16-bit UDH bytes
53    SixteenBit([u8; 7]),
54}
55
56impl ConcatenatedShortMessageUdhBytes {
57    /// Returns the bytes as a slice.
58    pub const fn as_bytes(&self) -> &[u8] {
59        match self {
60            Self::EightBit(bytes) => bytes,
61            Self::SixteenBit(bytes) => bytes,
62        }
63    }
64}
65
66/// Concatenated short message type.
67#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
68pub enum ConcatenatedShortMessageType {
69    /// 8-bit reference number concatenated short message.
70    EightBit { reference: u8 },
71    /// 16-bit reference number concatenated short message.
72    SixteenBit { reference: u16 },
73}
74
75impl ConcatenatedShortMessageType {
76    /// Creates a new [`ConcatenatedShortMessageType::EightBit`].
77    pub const fn u8(reference: u8) -> Self {
78        Self::EightBit { reference }
79    }
80
81    /// Creates a new [`ConcatenatedShortMessageType::SixteenBit`].
82    pub const fn u16(reference: u16) -> Self {
83        Self::SixteenBit { reference }
84    }
85
86    /// Returns the length of the UDH type in bytes.
87    pub const fn udh_length(self) -> usize {
88        match self {
89            Self::EightBit { .. } => ConcatenatedShortMessage8Bit::UDH_LENGTH,
90            Self::SixteenBit { .. } => ConcatenatedShortMessage16Bit::UDH_LENGTH,
91        }
92    }
93
94    /// Creates a new [`ConcatenatedShortMessage`]without checking invariants.
95    ///
96    /// See [`ConcatenatedShortMessage8Bit::new_unchecked`] and [`ConcatenatedShortMessage16Bit::new_unchecked`].
97    pub const fn concatenated_short_message_unchecked(
98        self,
99        total_parts: u8,
100        part_number: u8,
101    ) -> ConcatenatedShortMessage {
102        match self {
103            Self::EightBit { reference } => ConcatenatedShortMessage::EightBit(
104                ConcatenatedShortMessage8Bit::new_unchecked(reference, total_parts, part_number),
105            ),
106            Self::SixteenBit { reference } => ConcatenatedShortMessage::SixteenBit(
107                ConcatenatedShortMessage16Bit::new_unchecked(reference, total_parts, part_number),
108            ),
109        }
110    }
111}