rusmpp_core/pdus/owned/
submit_multi_resp.rs

1use 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    /// This field contains the MC message ID of the submitted
17    /// message. It may be used at a later stage to query the status
18    /// of a message, cancel or replace the message.
19    pub message_id: COctetString<1, 65>,
20    /// The number of messages to destination SME addresses that
21    /// were unsuccessfully submitted to the MC. This is followed by
22    /// the specified number of unsuccessful SMEs, each
23    /// specified in a unsuccess_sme field.
24    no_unsuccess: u8,
25    /// Unsuccessful SME.
26    ///
27    /// (Composite Field).
28    #[rusmpp(count = no_unsuccess)]
29    unsuccess_sme: alloc::vec::Vec<UnsuccessSme>,
30    /// Message submission response TLVs ([`MessageSubmissionResponseTlvValue`])
31    #[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}