rusmpp_core/pdus/owned/
submit_sm_resp.rs

1use rusmpp_macros::Rusmpp;
2
3use crate::{
4    pdus::owned::Pdu,
5    tlvs::owned::{MessageSubmissionResponseTlvValue, Tlv},
6    types::owned::COctetString,
7};
8
9#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
10#[rusmpp(decode = owned, test = skip)]
11#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
12#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
13#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
14pub struct SubmitSmResp {
15    /// This field contains the MC message ID of the submitted message.
16    /// It may be used at a later stage to query the status of a message,
17    /// cancel or replace the message.
18    message_id: COctetString<1, 65>,
19    /// Message submission response TLVs ([`MessageSubmissionResponseTlvValue`])
20    #[rusmpp(length = "unchecked")]
21    tlvs: alloc::vec::Vec<Tlv>,
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::{tests::TestInstance, values::*};
111
112    use super::*;
113
114    impl TestInstance for SubmitSmResp {
115        fn instances() -> alloc::vec::Vec<Self> {
116            alloc::vec![
117                Self::default(),
118                Self::builder()
119                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
120                    .build(),
121                Self::builder()
122                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
123                    .tlvs(alloc::vec![
124                        MessageSubmissionResponseTlvValue::AdditionalStatusInfoText(
125                            COctetString::from_str("Octets indeed").unwrap(),
126                        ),
127                        MessageSubmissionResponseTlvValue::DeliveryFailureReason(
128                            DeliveryFailureReason::TemporaryNetworkError,
129                        ),
130                    ])
131                    .build(),
132            ]
133        }
134    }
135
136    #[test]
137    fn encode_decode() {
138        crate::tests::owned::encode_decode_with_length_test_instances::<SubmitSmResp>();
139    }
140}