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<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}