rusmpp/pdus/
submit_sm_resp.rs

1use crate::{
2    Pdu,
3    tlvs::{MessageSubmissionResponseTlvValue, Tlv},
4    types::COctetString,
5};
6
7crate::create! {
8    @[skip_test]
9    #[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
10    #[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
11    #[cfg_attr(feature = "serde", derive(::serde::Serialize))]
12    #[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
13    pub struct SubmitSmResp {
14        /// This field contains the MC message ID of the submitted message.
15        /// It may be used at a later stage to query the status of a message,
16        /// cancel or replace the message.
17        message_id: COctetString<1, 65>,
18        /// Message submission response TLVs ([`MessageSubmissionResponseTlvValue`])
19        @[length = unchecked]
20        tlvs: alloc::vec::Vec<Tlv>,
21    }
22}
23
24impl SubmitSmResp {
25    pub fn new(
26        message_id: COctetString<1, 65>,
27        tlvs: alloc::vec::Vec<impl Into<MessageSubmissionResponseTlvValue>>,
28    ) -> Self {
29        let tlvs = tlvs.into_iter().map(Into::into).map(From::from).collect();
30
31        Self { message_id, tlvs }
32    }
33
34    pub fn message_id(&self) -> &COctetString<1, 65> {
35        &self.message_id
36    }
37
38    pub fn tlvs(&self) -> &[Tlv] {
39        &self.tlvs
40    }
41
42    pub fn set_tlvs(
43        &mut self,
44        tlvs: alloc::vec::Vec<impl Into<MessageSubmissionResponseTlvValue>>,
45    ) {
46        self.tlvs = tlvs.into_iter().map(Into::into).map(From::from).collect();
47    }
48
49    pub fn clear_tlvs(&mut self) {
50        self.tlvs.clear();
51    }
52
53    pub fn push_tlv(&mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) {
54        self.tlvs.push(Tlv::from(tlv.into()));
55    }
56
57    pub fn builder() -> SubmitSmRespBuilder {
58        SubmitSmRespBuilder::new()
59    }
60}
61
62impl From<SubmitSmResp> for Pdu {
63    fn from(value: SubmitSmResp) -> Self {
64        Self::SubmitSmResp(value)
65    }
66}
67
68#[derive(Debug, Default)]
69pub struct SubmitSmRespBuilder {
70    inner: SubmitSmResp,
71}
72
73impl SubmitSmRespBuilder {
74    pub fn new() -> Self {
75        Self::default()
76    }
77
78    pub fn message_id(mut self, message_id: COctetString<1, 65>) -> Self {
79        self.inner.message_id = message_id;
80        self
81    }
82
83    pub fn tlvs(
84        mut self,
85        tlvs: alloc::vec::Vec<impl Into<MessageSubmissionResponseTlvValue>>,
86    ) -> Self {
87        self.inner.set_tlvs(tlvs);
88        self
89    }
90
91    pub fn clear_tlvs(mut self) -> Self {
92        self.inner.clear_tlvs();
93        self
94    }
95
96    pub fn push_tlv(mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) -> Self {
97        self.inner.push_tlv(tlv);
98        self
99    }
100
101    pub fn build(self) -> SubmitSmResp {
102        self.inner
103    }
104}
105
106#[cfg(test)]
107mod tests {
108    use std::str::FromStr;
109
110    use crate::{
111        tests::TestInstance, tlvs::MessageSubmissionResponseTlvValue, values::DeliveryFailureReason,
112    };
113
114    use super::*;
115
116    impl TestInstance for SubmitSmResp {
117        fn instances() -> alloc::vec::Vec<Self> {
118            alloc::vec![
119                Self::default(),
120                Self::builder()
121                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
122                    .build(),
123                Self::builder()
124                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
125                    .tlvs(alloc::vec![
126                        MessageSubmissionResponseTlvValue::AdditionalStatusInfoText(
127                            COctetString::from_str("Octets indeed").unwrap(),
128                        ),
129                        MessageSubmissionResponseTlvValue::DeliveryFailureReason(
130                            DeliveryFailureReason::TemporaryNetworkError,
131                        ),
132                    ])
133                    .build(),
134            ]
135        }
136    }
137
138    #[test]
139    fn encode_decode() {
140        crate::tests::encode_decode_with_length_test_instances::<SubmitSmResp>();
141    }
142}