rusmpp_core/values/
registered_delivery.rs

1use rusmpp_macros::Rusmpp;
2
3#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Rusmpp)]
4#[rusmpp(repr = "u8")]
5#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
6#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
7#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
8pub struct RegisteredDelivery {
9    mc_delivery_receipt: MCDeliveryReceipt,
10    sme_originated_acknowledgement: SmeOriginatedAcknowledgement,
11    intermediate_notification: IntermediateNotification,
12    other: u8,
13}
14
15impl RegisteredDelivery {
16    pub fn new(
17        mc_delivery_receipt: MCDeliveryReceipt,
18        sme_originated_acknowledgement: SmeOriginatedAcknowledgement,
19        intermediate_notification: IntermediateNotification,
20        other: u8,
21    ) -> Self {
22        // remove first 5 bits from other
23        let other = other & 0b00011111;
24
25        Self {
26            mc_delivery_receipt,
27            sme_originated_acknowledgement,
28            intermediate_notification,
29            other,
30        }
31    }
32
33    /// Request all delivery receipts, acknowledgements and notifications
34    pub fn request_all() -> Self {
35        Self::new(
36            MCDeliveryReceipt::McDeliveryReceiptRequestedWhereFinalDeliveryOutcomeIsSuccessOrFailure,
37            SmeOriginatedAcknowledgement::BothDeliveryAndUserAcknowledgmentRequested,
38            IntermediateNotification::IntermediateNotificationRequested,
39            0,
40        )
41    }
42
43    pub fn mc_delivery_receipt(&self) -> MCDeliveryReceipt {
44        self.mc_delivery_receipt
45    }
46
47    pub fn sme_originated_acknowledgement(&self) -> SmeOriginatedAcknowledgement {
48        self.sme_originated_acknowledgement
49    }
50
51    pub fn intermediate_notification(&self) -> IntermediateNotification {
52        self.intermediate_notification
53    }
54
55    pub fn other(&self) -> u8 {
56        self.other
57    }
58}
59
60impl From<u8> for RegisteredDelivery {
61    fn from(value: u8) -> Self {
62        let mc_delivery_receipt = MCDeliveryReceipt::from(value & 0b00000011);
63        let sme_originated_acknowledgement = SmeOriginatedAcknowledgement::from(value & 0b00001100);
64        let intermediate_notification = IntermediateNotification::from(value & 0b00010000);
65        let other = value & 0b11100000;
66
67        Self {
68            mc_delivery_receipt,
69            sme_originated_acknowledgement,
70            intermediate_notification,
71            other,
72        }
73    }
74}
75
76impl From<RegisteredDelivery> for u8 {
77    fn from(value: RegisteredDelivery) -> Self {
78        u8::from(value.mc_delivery_receipt)
79            | u8::from(value.sme_originated_acknowledgement)
80            | u8::from(value.intermediate_notification)
81            | value.other
82    }
83}
84
85#[repr(u8)]
86#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Rusmpp)]
87#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
88#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
89#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
90pub enum MCDeliveryReceipt {
91    #[default]
92    NoMcDeliveryReceiptRequested = 0b00000000,
93    McDeliveryReceiptRequestedWhereFinalDeliveryOutcomeIsSuccessOrFailure = 0b00000001,
94    McDeliveryReceiptRequestedWhereFinalDeliveryOutcomeIsFailure = 0b00000010,
95    McDeliveryReceiptRequestedWhereFinalDeliveryOutcomeIsSuccess = 0b00000011,
96    Other(u8),
97}
98
99#[repr(u8)]
100#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Rusmpp)]
101#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
102#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
103#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
104pub enum SmeOriginatedAcknowledgement {
105    #[default]
106    NoReceiptSmeAcknowledgementRequested = 0b00000000,
107    SmeDeliveryAcknowledgementRequested = 0b00000100,
108    SmeUserAcknowledgementRequested = 0b00001000,
109    BothDeliveryAndUserAcknowledgmentRequested = 0b00001100,
110    Other(u8),
111}
112
113#[repr(u8)]
114#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default, Rusmpp)]
115#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
116#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
117#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
118pub enum IntermediateNotification {
119    #[default]
120    NoIntermediaryNotificationRequested = 0b00000000,
121    IntermediateNotificationRequested = 0b00010000,
122    Other(u8),
123}
124
125#[cfg(test)]
126mod tests {
127    use super::*;
128
129    #[test]
130    fn encode_decode() {
131        #[cfg(feature = "alloc")]
132        crate::tests::owned::encode_decode_test_instances::<RegisteredDelivery>();
133        crate::tests::borrowed::encode_decode_test_instances::<RegisteredDelivery>();
134        #[cfg(feature = "alloc")]
135        crate::tests::owned::encode_decode_test_instances::<MCDeliveryReceipt>();
136        crate::tests::borrowed::encode_decode_test_instances::<MCDeliveryReceipt>();
137        #[cfg(feature = "alloc")]
138        crate::tests::owned::encode_decode_test_instances::<SmeOriginatedAcknowledgement>();
139        crate::tests::borrowed::encode_decode_test_instances::<SmeOriginatedAcknowledgement>();
140        #[cfg(feature = "alloc")]
141        crate::tests::owned::encode_decode_test_instances::<IntermediateNotification>();
142        crate::tests::borrowed::encode_decode_test_instances::<IntermediateNotification>();
143    }
144}