rusmpp_core/pdus/owned/
data_sm.rs1use rusmpp_macros::Rusmpp;
2
3use crate::{
4 pdus::owned::Pdu,
5 tlvs::owned::{MessageSubmissionRequestTlvValue, Tlv},
6 types::owned::COctetString,
7 values::{owned::*, *},
8};
9#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
14#[rusmpp(decode = owned, test = skip)]
15#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
16#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
17#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
18pub struct DataSm {
19 pub service_type: ServiceType,
29 pub source_addr_ton: Ton,
35 pub source_addr_npi: Npi,
41 pub source_addr: COctetString<1, 21>,
47 pub dest_addr_ton: Ton,
49 pub dest_addr_npi: Npi,
51 pub destination_addr: COctetString<1, 21>,
55 pub esm_class: EsmClass,
57 pub registered_delivery: RegisteredDelivery,
61 pub data_coding: DataCoding,
64 #[rusmpp(length = "unchecked")]
66 tlvs: alloc::vec::Vec<Tlv>,
67}
68
69impl DataSm {
70 #[allow(clippy::too_many_arguments)]
71 pub fn new(
72 service_type: ServiceType,
73 source_addr_ton: Ton,
74 source_addr_npi: Npi,
75 source_addr: COctetString<1, 21>,
76 dest_addr_ton: Ton,
77 dest_addr_npi: Npi,
78 destination_addr: COctetString<1, 21>,
79 esm_class: EsmClass,
80 registered_delivery: RegisteredDelivery,
81 data_coding: DataCoding,
82 tlvs: alloc::vec::Vec<impl Into<MessageSubmissionRequestTlvValue>>,
83 ) -> Self {
84 let tlvs = tlvs.into_iter().map(Into::into).map(From::from).collect();
85
86 Self {
87 service_type,
88 source_addr_ton,
89 source_addr_npi,
90 source_addr,
91 dest_addr_ton,
92 dest_addr_npi,
93 destination_addr,
94 esm_class,
95 registered_delivery,
96 data_coding,
97 tlvs,
98 }
99 }
100
101 pub fn tlvs(&self) -> &[Tlv] {
102 &self.tlvs
103 }
104
105 pub fn set_tlvs(&mut self, tlvs: alloc::vec::Vec<impl Into<MessageSubmissionRequestTlvValue>>) {
106 self.tlvs = tlvs.into_iter().map(Into::into).map(From::from).collect();
107 }
108
109 pub fn clear_tlvs(&mut self) {
110 self.tlvs.clear();
111 }
112
113 pub fn push_tlv(&mut self, tlv: impl Into<MessageSubmissionRequestTlvValue>) {
114 self.tlvs.push(Tlv::from(tlv.into()));
115 }
116
117 pub fn builder() -> DataSmBuilder {
118 DataSmBuilder::new()
119 }
120}
121
122impl From<DataSm> for Pdu {
123 fn from(value: DataSm) -> Self {
124 Self::DataSm(value)
125 }
126}
127
128#[derive(Debug, Default)]
129pub struct DataSmBuilder {
130 inner: DataSm,
131}
132
133impl DataSmBuilder {
134 pub fn new() -> Self {
135 Default::default()
136 }
137
138 pub fn service_type(mut self, service_type: ServiceType) -> Self {
139 self.inner.service_type = service_type;
140 self
141 }
142
143 pub fn source_addr_ton(mut self, source_addr_ton: Ton) -> Self {
144 self.inner.source_addr_ton = source_addr_ton;
145 self
146 }
147
148 pub fn source_addr_npi(mut self, source_addr_npi: Npi) -> Self {
149 self.inner.source_addr_npi = source_addr_npi;
150 self
151 }
152
153 pub fn source_addr(mut self, source_addr: COctetString<1, 21>) -> Self {
154 self.inner.source_addr = source_addr;
155 self
156 }
157
158 pub fn dest_addr_ton(mut self, dest_addr_ton: Ton) -> Self {
159 self.inner.dest_addr_ton = dest_addr_ton;
160 self
161 }
162
163 pub fn dest_addr_npi(mut self, dest_addr_npi: Npi) -> Self {
164 self.inner.dest_addr_npi = dest_addr_npi;
165 self
166 }
167
168 pub fn destination_addr(mut self, destination_addr: COctetString<1, 21>) -> Self {
169 self.inner.destination_addr = destination_addr;
170 self
171 }
172
173 pub fn esm_class(mut self, esm_class: EsmClass) -> Self {
174 self.inner.esm_class = esm_class;
175 self
176 }
177
178 pub fn registered_delivery(mut self, registered_delivery: RegisteredDelivery) -> Self {
179 self.inner.registered_delivery = registered_delivery;
180 self
181 }
182
183 pub fn data_coding(mut self, data_coding: DataCoding) -> Self {
184 self.inner.data_coding = data_coding;
185 self
186 }
187
188 pub fn tlvs(
189 mut self,
190 tlvs: alloc::vec::Vec<impl Into<MessageSubmissionRequestTlvValue>>,
191 ) -> Self {
192 self.inner.set_tlvs(tlvs);
193 self
194 }
195
196 pub fn clear_tlvs(mut self) -> Self {
197 self.inner.clear_tlvs();
198 self
199 }
200
201 pub fn push_tlv(mut self, tlv: impl Into<MessageSubmissionRequestTlvValue>) -> Self {
202 self.inner.push_tlv(tlv);
203 self
204 }
205
206 pub fn build(self) -> DataSm {
207 self.inner
208 }
209}
210
211#[cfg(test)]
212mod tests {
213 use std::str::FromStr;
214
215 use crate::tests::TestInstance;
216
217 use super::*;
218
219 impl TestInstance for DataSm {
220 fn instances() -> alloc::vec::Vec<Self> {
221 alloc::vec![
222 Self::default(),
223 Self::builder()
224 .service_type(ServiceType::default())
225 .source_addr_ton(Ton::International)
226 .source_addr_npi(Npi::Isdn)
227 .source_addr(COctetString::from_str("source_addr").unwrap())
228 .dest_addr_ton(Ton::International)
229 .dest_addr_npi(Npi::Isdn)
230 .destination_addr(COctetString::from_str("destination_addr").unwrap())
231 .esm_class(EsmClass::default())
232 .registered_delivery(RegisteredDelivery::request_all())
233 .data_coding(DataCoding::Ucs2)
234 .build(),
235 Self::builder()
236 .service_type(ServiceType::default())
237 .source_addr_ton(Ton::International)
238 .source_addr_npi(Npi::Isdn)
239 .source_addr(COctetString::from_str("source_addr").unwrap())
240 .dest_addr_ton(Ton::International)
241 .dest_addr_npi(Npi::Isdn)
242 .destination_addr(COctetString::from_str("destination_addr").unwrap())
243 .esm_class(EsmClass::default())
244 .registered_delivery(RegisteredDelivery::new(
245 MCDeliveryReceipt::NoMcDeliveryReceiptRequested,
246 SmeOriginatedAcknowledgement::SmeUserAcknowledgementRequested,
247 IntermediateNotification::IntermediateNotificationRequested,
248 0,
249 ))
250 .data_coding(DataCoding::Ucs2)
251 .push_tlv(MessageSubmissionRequestTlvValue::SourceAddrSubunit(
252 AddrSubunit::MobileEquipment,
253 ))
254 .push_tlv(MessageSubmissionRequestTlvValue::UssdServiceOp(
255 UssdServiceOp::UssnConfirm,
256 ))
257 .build(),
258 ]
259 }
260 }
261
262 #[test]
263 fn encode_decode() {
264 crate::tests::owned::encode_decode_with_length_test_instances::<DataSm>();
265 }
266}