rusmpp_core/pdus/owned/
submit_multi_resp.rs1use rusmpp_macros::Rusmpp;
2
3use crate::{
4 pdus::owned::Pdu,
5 tlvs::owned::{MessageSubmissionResponseTlvValue, Tlv},
6 types::owned::COctetString,
7 values::owned::*,
8};
9
10#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
11#[rusmpp(decode = owned, test = skip)]
12#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
13#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
14#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
15pub struct SubmitMultiResp {
16 pub message_id: COctetString<1, 65>,
20 no_unsuccess: u8,
25 #[rusmpp(count = no_unsuccess)]
29 unsuccess_sme: alloc::vec::Vec<UnsuccessSme>,
30 #[rusmpp(length = "unchecked")]
32 tlvs: alloc::vec::Vec<Tlv>,
33}
34
35impl SubmitMultiResp {
36 pub fn new(
37 message_id: COctetString<1, 65>,
38 unsuccess_sme: alloc::vec::Vec<UnsuccessSme>,
39 tlvs: alloc::vec::Vec<MessageSubmissionResponseTlvValue>,
40 ) -> Self {
41 let no_unsuccess = unsuccess_sme.len() as u8;
42
43 let tlvs = tlvs.into_iter().map(From::from).collect();
44
45 Self {
46 message_id,
47 no_unsuccess,
48 unsuccess_sme,
49 tlvs,
50 }
51 }
52
53 pub fn no_unsuccess(&self) -> u8 {
54 self.no_unsuccess
55 }
56
57 pub fn unsuccess_sme(&self) -> &[UnsuccessSme] {
58 &self.unsuccess_sme
59 }
60
61 pub fn set_unsuccess_sme(&mut self, unsuccess_sme: alloc::vec::Vec<UnsuccessSme>) {
62 self.unsuccess_sme = unsuccess_sme;
63 self.no_unsuccess = self.unsuccess_sme.len() as u8;
64 }
65
66 pub fn push_unsuccess_sme(&mut self, unsuccess_sme: UnsuccessSme) {
67 self.unsuccess_sme.push(unsuccess_sme);
68 self.no_unsuccess = self.unsuccess_sme.len() as u8;
69 }
70
71 pub fn clear_unsuccess_sme(&mut self) {
72 self.unsuccess_sme.clear();
73 self.no_unsuccess = self.unsuccess_sme.len() as u8;
74 }
75
76 pub fn tlvs(&self) -> &[Tlv] {
77 &self.tlvs
78 }
79
80 pub fn set_tlvs(&mut self, tlvs: alloc::vec::Vec<MessageSubmissionResponseTlvValue>) {
81 self.tlvs = tlvs.into_iter().map(From::from).collect();
82 }
83
84 pub fn clear_tlvs(&mut self) {
85 self.tlvs.clear();
86 }
87
88 pub fn push_tlv(&mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) {
89 self.tlvs.push(Tlv::from(tlv.into()));
90 }
91
92 pub fn builder() -> SubmitMultiRespBuilder {
93 SubmitMultiRespBuilder::new()
94 }
95}
96
97impl From<SubmitMultiResp> for Pdu {
98 fn from(value: SubmitMultiResp) -> Self {
99 Self::SubmitMultiResp(value)
100 }
101}
102
103#[derive(Debug, Default)]
104pub struct SubmitMultiRespBuilder {
105 inner: SubmitMultiResp,
106}
107
108impl SubmitMultiRespBuilder {
109 pub fn new() -> Self {
110 Self::default()
111 }
112
113 pub fn message_id(mut self, message_id: COctetString<1, 65>) -> Self {
114 self.inner.message_id = message_id;
115 self
116 }
117
118 pub fn unsuccess_sme(mut self, unsuccess_sme: alloc::vec::Vec<UnsuccessSme>) -> Self {
119 self.inner.set_unsuccess_sme(unsuccess_sme);
120 self
121 }
122
123 pub fn push_unsuccess_sme(mut self, unsuccess_sme: UnsuccessSme) -> Self {
124 self.inner.push_unsuccess_sme(unsuccess_sme);
125 self
126 }
127
128 pub fn clear_unsuccess_sme(mut self) -> Self {
129 self.inner.clear_unsuccess_sme();
130 self
131 }
132
133 pub fn tlvs(mut self, tlvs: alloc::vec::Vec<MessageSubmissionResponseTlvValue>) -> Self {
134 self.inner.set_tlvs(tlvs);
135 self
136 }
137
138 pub fn clear_tlvs(mut self) -> Self {
139 self.inner.clear_tlvs();
140 self
141 }
142
143 pub fn push_tlv(mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) -> Self {
144 self.inner.push_tlv(tlv);
145 self
146 }
147
148 pub fn build(self) -> SubmitMultiResp {
149 self.inner
150 }
151}
152
153#[cfg(test)]
154mod tests {
155 use std::str::FromStr;
156
157 use crate::{CommandStatus, tests::TestInstance, values::*};
158
159 use super::*;
160
161 impl TestInstance for SubmitMultiResp {
162 fn instances() -> alloc::vec::Vec<Self> {
163 alloc::vec![
164 Self::default(),
165 Self::builder()
166 .message_id(COctetString::from_str("1234567890").unwrap())
167 .build(),
168 Self::builder()
169 .message_id(COctetString::from_str("1234567890").unwrap())
170 .push_unsuccess_sme(UnsuccessSme::default())
171 .push_unsuccess_sme(UnsuccessSme::new(
172 Ton::International,
173 Npi::Data,
174 COctetString::from_str("1234567890").unwrap(),
175 CommandStatus::EsmeRunknownerr,
176 ))
177 .build(),
178 Self::builder()
179 .message_id(COctetString::from_str("1234567890").unwrap())
180 .push_tlv(MessageSubmissionResponseTlvValue::DpfResult(
181 DpfResult::NotSet,
182 ))
183 .push_tlv(MessageSubmissionResponseTlvValue::NetworkErrorCode(
184 NetworkErrorCode::new(ErrorCodeNetworkType::Is95AccessDeniedReason, 0x01),
185 ))
186 .build(),
187 ]
188 }
189 }
190
191 #[test]
192 fn encode_decode() {
193 crate::tests::owned::encode_decode_with_length_test_instances::<SubmitMultiResp>();
194 }
195
196 #[test]
197 fn count() {
198 let submit_multi = SubmitMultiResp::default();
199
200 assert_eq!(submit_multi.no_unsuccess(), 0);
201 assert!(submit_multi.unsuccess_sme().is_empty());
202
203 let submit_multi = SubmitMultiResp::builder()
204 .unsuccess_sme(alloc::vec![
205 UnsuccessSme::default(),
206 UnsuccessSme::new(
207 Ton::International,
208 Npi::Data,
209 COctetString::from_str("1234567890").unwrap(),
210 CommandStatus::EsmeRunknownerr,
211 ),
212 ])
213 .build();
214
215 assert_eq!(submit_multi.no_unsuccess(), 2);
216 assert_eq!(submit_multi.unsuccess_sme().len(), 2);
217
218 let submit_multi = SubmitMultiResp::builder()
219 .push_unsuccess_sme(UnsuccessSme::default())
220 .push_unsuccess_sme(UnsuccessSme::new(
221 Ton::International,
222 Npi::Data,
223 COctetString::from_str("1234567890").unwrap(),
224 CommandStatus::EsmeRunknownerr,
225 ))
226 .build();
227
228 assert_eq!(submit_multi.no_unsuccess(), 2);
229 assert_eq!(submit_multi.unsuccess_sme().len(), 2);
230
231 let submit_multi = SubmitMultiResp::builder()
232 .push_unsuccess_sme(UnsuccessSme::default())
233 .push_unsuccess_sme(UnsuccessSme::new(
234 Ton::International,
235 Npi::Data,
236 COctetString::from_str("1234567890").unwrap(),
237 CommandStatus::EsmeRunknownerr,
238 ))
239 .clear_unsuccess_sme()
240 .build();
241
242 assert_eq!(submit_multi.no_unsuccess(), 0);
243 assert!(submit_multi.unsuccess_sme().is_empty());
244 }
245}