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<MessageSubmissionResponseTlvValue>,
28    ) -> Self {
29        let tlvs = tlvs.into_iter().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(&mut self, tlvs: alloc::vec::Vec<MessageSubmissionResponseTlvValue>) {
43        self.tlvs = tlvs.into_iter().map(From::from).collect();
44    }
45
46    pub fn clear_tlvs(&mut self) {
47        self.tlvs.clear();
48    }
49
50    pub fn push_tlv(&mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) {
51        self.tlvs.push(Tlv::from(tlv.into()));
52    }
53
54    pub fn builder() -> SubmitSmRespBuilder {
55        SubmitSmRespBuilder::new()
56    }
57}
58
59impl From<SubmitSmResp> for Pdu {
60    fn from(value: SubmitSmResp) -> Self {
61        Self::SubmitSmResp(value)
62    }
63}
64
65#[derive(Debug, Default)]
66pub struct SubmitSmRespBuilder {
67    inner: SubmitSmResp,
68}
69
70impl SubmitSmRespBuilder {
71    pub fn new() -> Self {
72        Self::default()
73    }
74
75    pub fn message_id(mut self, message_id: COctetString<1, 65>) -> Self {
76        self.inner.message_id = message_id;
77        self
78    }
79
80    pub fn tlvs(mut self, tlvs: alloc::vec::Vec<MessageSubmissionResponseTlvValue>) -> Self {
81        self.inner.set_tlvs(tlvs);
82        self
83    }
84
85    pub fn clear_tlvs(mut self) -> Self {
86        self.inner.clear_tlvs();
87        self
88    }
89
90    pub fn push_tlv(mut self, tlv: impl Into<MessageSubmissionResponseTlvValue>) -> Self {
91        self.inner.push_tlv(tlv);
92        self
93    }
94
95    pub fn build(self) -> SubmitSmResp {
96        self.inner
97    }
98}
99
100#[cfg(test)]
101mod tests {
102    use std::str::FromStr;
103
104    use crate::{tests::TestInstance, values::*};
105
106    use super::*;
107
108    impl TestInstance for SubmitSmResp {
109        fn instances() -> alloc::vec::Vec<Self> {
110            alloc::vec![
111                Self::default(),
112                Self::builder()
113                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
114                    .build(),
115                Self::builder()
116                    .message_id(COctetString::from_str("12345678901234567890123").unwrap())
117                    .tlvs(alloc::vec![
118                        MessageSubmissionResponseTlvValue::AdditionalStatusInfoText(
119                            COctetString::from_str("Octets indeed").unwrap(),
120                        ),
121                        MessageSubmissionResponseTlvValue::DeliveryFailureReason(
122                            DeliveryFailureReason::TemporaryNetworkError,
123                        ),
124                    ])
125                    .build(),
126            ]
127        }
128    }
129
130    #[test]
131    fn encode_decode() {
132        crate::tests::owned::encode_decode_with_length_test_instances::<SubmitSmResp>();
133    }
134}