rusmpp_core/tlvs/borrowed/
tlv.rs

1use rusmpp_macros::Rusmpp;
2
3use crate::{
4    encode::Length,
5    tlvs::{borrowed::TlvValue, tag::TlvTag},
6};
7
8mod broadcast_request;
9pub use broadcast_request::*;
10
11mod broadcast_response;
12pub use broadcast_response::*;
13
14mod cancel_broadcast;
15pub use cancel_broadcast::*;
16
17mod message_delivery_request;
18pub use message_delivery_request::*;
19
20mod message_delivery_response;
21pub use message_delivery_response::*;
22
23mod message_submission_request;
24pub use message_submission_request::*;
25
26mod message_submission_response;
27pub use message_submission_response::*;
28
29mod query_broadcast_response;
30pub use query_broadcast_response::*;
31
32/// See module level documentation.
33#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
34#[rusmpp(decode = borrowed, test = skip)]
35#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
36#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
37pub struct Tlv<'a> {
38    tag: TlvTag,
39    value_length: u16,
40    #[rusmpp(key = tag, length = value_length)]
41    value: Option<TlvValue<'a>>,
42}
43
44impl<'a> Tlv<'a> {
45    pub fn new(value: impl Into<TlvValue<'a>>) -> Self {
46        let value = value.into();
47        let tag = value.tag();
48        let value_length = value.length() as u16;
49
50        Self {
51            tag,
52            value_length,
53            value: Some(value),
54        }
55    }
56
57    pub const fn tag(&self) -> TlvTag {
58        self.tag
59    }
60
61    pub const fn value_length(&self) -> u16 {
62        self.value_length
63    }
64
65    pub const fn value(&'_ self) -> Option<&'_ TlvValue<'_>> {
66        self.value.as_ref()
67    }
68}
69
70impl<'a> From<TlvValue<'a>> for Tlv<'a> {
71    fn from(value: TlvValue<'a>) -> Self {
72        Self::new(value)
73    }
74}