rusmpp_extra/encoding/owned/
submit_sm.rs1use rusmpp_core::{pdus::owned::SubmitSm, types::owned::OctetString};
2
3use crate::{
4 encoding::{
5 errors::EncodeError, gsm7bit::Gsm7BitUnpacked, latin1::Latin1, owned::Encoder, ucs2::Ucs2,
6 },
7 fallback::Fallback,
8};
9
10#[derive(Debug)]
14pub struct EncodedSubmitSmBuilder<'a, E> {
15 short_message: &'a str,
16 sm: SubmitSm,
17 encoder: E,
18}
19
20impl<E> EncodedSubmitSmBuilder<'static, E> {}
21
22impl<'a, E> EncodedSubmitSmBuilder<'a, E> {
23 const fn new(
25 short_message: &'a str,
26 sm: SubmitSm,
27 encoder: E,
28 ) -> EncodedSubmitSmBuilder<'a, E> {
29 Self {
30 short_message,
31 sm,
32 encoder,
33 }
34 }
35
36 pub fn encoder<U>(self, encoder: U) -> EncodedSubmitSmBuilder<'a, U> {
38 EncodedSubmitSmBuilder {
39 short_message: self.short_message,
40 sm: self.sm,
41 encoder,
42 }
43 }
44
45 pub fn gsm7bit_unpacked(self) -> EncodedSubmitSmBuilder<'a, Gsm7BitUnpacked> {
47 self.encoder(Gsm7BitUnpacked::new())
48 }
49
50 pub fn ucs2(self) -> EncodedSubmitSmBuilder<'a, Ucs2> {
52 self.encoder(Ucs2::new())
53 }
54
55 pub fn latin1(self) -> EncodedSubmitSmBuilder<'a, Latin1> {
57 self.encoder(Latin1::new())
58 }
59
60 pub fn fallback<U>(self, encoder: U) -> EncodedSubmitSmBuilder<'a, Fallback<E, U>> {
62 EncodedSubmitSmBuilder {
63 short_message: self.short_message,
64 sm: self.sm,
65 encoder: Fallback::new(self.encoder, encoder),
66 }
67 }
68}
69
70impl<'a, E> EncodedSubmitSmBuilder<'a, E>
71where
72 E: Encoder + 'a,
73{
74 pub fn build(self) -> Result<SubmitSm, EncodeError<E::Error>> {
76 let (encoded, data_coding) = self
77 .encoder
78 .encode(self.short_message)
79 .map_err(EncodeError::encode)?;
80
81 let short_message = OctetString::from_vec(encoded)?;
82
83 let sm = self
84 .sm
85 .with_short_message(short_message)
86 .with_data_coding(data_coding);
87
88 Ok(sm)
89 }
90}
91
92pub trait EncodedSubmitSmExt {
94 fn encode<'a>(self, short_message: &'a str) -> EncodedSubmitSmBuilder<'a, Gsm7BitUnpacked>;
101}
102
103impl EncodedSubmitSmExt for SubmitSm {
104 fn encode<'a>(self, short_message: &'a str) -> EncodedSubmitSmBuilder<'a, Gsm7BitUnpacked> {
105 EncodedSubmitSmBuilder::new(short_message, self, Gsm7BitUnpacked::new())
106 }
107}