rusmpp_core/pdus/owned/
submit_sm_resp.rs1use 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 message_id: COctetString<1, 65>,
19 #[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}