rusmpp_core/tlvs/owned/
tlv.rs1use rusmpp_macros::Rusmpp;
2
3use crate::{
4 encode::Length,
5 tlvs::{owned::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#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Rusmpp)]
34#[rusmpp(decode = owned, test = skip)]
35#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
36#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
37#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
38pub struct Tlv {
39 tag: TlvTag,
40 value_length: u16,
41 #[rusmpp(key = tag, length = value_length)]
42 value: Option<TlvValue>,
43}
44
45impl Tlv {
46 pub fn new(value: impl Into<TlvValue>) -> Self {
47 let value = value.into();
48 let tag = value.tag();
49 let value_length = value.length() as u16;
50
51 Self {
52 tag,
53 value_length,
54 value: Some(value),
55 }
56 }
57
58 pub const fn tag(&self) -> TlvTag {
59 self.tag
60 }
61
62 pub const fn value_length(&self) -> u16 {
63 self.value_length
64 }
65
66 pub const fn value(&self) -> Option<&TlvValue> {
67 self.value.as_ref()
68 }
69}
70
71impl From<TlvValue> for Tlv {
72 fn from(value: TlvValue) -> Self {
73 Self::new(value)
74 }
75}