rusmpp_extra/encoding/owned/
submit_sm.rs

1use 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/// Builder for creating encoded [`SubmitSm`] messages.
11///
12/// Created using [`EncodedSubmitSmExt::encode`].
13#[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    /// Creates a new [`EncodedSubmitSmBuilder`].
24    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    /// Sets a custom encoder.
37    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    /// Sets the [`Gsm7BitUnpacked`] encoder.
46    pub fn gsm7bit_unpacked(self) -> EncodedSubmitSmBuilder<'a, Gsm7BitUnpacked> {
47        self.encoder(Gsm7BitUnpacked::new())
48    }
49
50    /// Sets the [`Ucs2`] encoder.
51    pub fn ucs2(self) -> EncodedSubmitSmBuilder<'a, Ucs2> {
52        self.encoder(Ucs2::new())
53    }
54
55    /// Sets the [`Latin1`] encoder.
56    pub fn latin1(self) -> EncodedSubmitSmBuilder<'a, Latin1> {
57        self.encoder(Latin1::new())
58    }
59
60    /// Sets a fallback encoder.
61    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    /// Builds the encoded [`SubmitSm`] message.
75    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
92/// Extension trait for [`SubmitSm`] to create encoded messages.
93pub trait EncodedSubmitSmExt {
94    /// Creates a new [`EncodedSubmitSmBuilder`] with the default [`Gsm7BitUnpacked`] encoder.
95    ///
96    /// # Notes
97    ///
98    /// - [`SubmitSm::data_coding`] will be overridden by the multipart builder to match the encoder.
99    /// - [`SubmitSm::short_message`] will be overridden by `short_message` of the multipart builder.
100    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}