rusmpp_core/tlvs/owned/
value.rs

1use bytes::BytesMut;
2
3use crate::{
4    CommandStatus,
5    decode::{
6        DecodeError, DecodeResultExt,
7        owned::{Decode, DecodeWithKey, DecodeWithLength},
8    },
9    encode::Length,
10    tlvs::TlvTag,
11    types::owned::{AnyOctetString, COctetString, OctetString},
12    values::{owned::*, *},
13};
14
15/// See module level documentation.
16#[non_exhaustive]
17#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
18#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
19#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
20#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
21pub enum TlvValue {
22    AdditionalStatusInfoText(COctetString<1, 256>),
23    AlertOnMessageDelivery(AlertOnMessageDelivery),
24    BillingIdentification(OctetString<0, 1024>),
25    /// Identifies one or more target Broadcast Area(s) for which the
26    /// status information applies.
27    ///
28    /// The number of instances of this parameter will be exactly equal
29    /// to the number of occurrences of the broadcast_area_identifiers
30    /// parameter in the corresponding broadcast_sm.
31    BroadcastAreaIdentifier(BroadcastAreaIdentifier),
32    /// The success rate indicator, defined as the ratio of the
33    /// number of BTSs that accepted the message and the total
34    /// number of BTSs that should have accepted the message, for
35    /// a particular broadcast_area_identifier.
36    BroadcastAreaSuccess(BroadcastAreaSuccess),
37    BroadcastContentTypeInfo(OctetString<0, 255>),
38    BroadcastChannelIndicator(BroadcastChannelIndicator),
39    /// Specifies the content type of the message.
40    BroadcastContentType(BroadcastContentType),
41    /// Absolute time is formatted as a 16-character string (encoded as a 17-octet C-octet String)
42    /// “YYMMDDhhmmsstnnp” where:
43    ///
44    /// | Digits | Meaning |
45    /// |--------|---------|
46    /// | ‘YY’   | last two digits of the year (00-99)   |
47    /// | ‘MM’   | month (01-12)                         |
48    /// | ‘DD’   | day (01-31)                           |
49    /// | ‘hh’   | hour (00-23)                          |
50    /// | ‘mm’   | minute (00-59)                        |
51    /// | ‘ss’   | second (00-59)                        |
52    /// | ‘t’    | tenths of second (0-9)                |
53    /// | ‘nn’   | time difference in quarter hours between local time (as expressed in the first 13 octets) and UTC (Universal Time Constant) time (00-48). |
54    /// | ‘p’    | “+” Local time is in quarter hours advanced in relation to UTC time. “-” Local time is in quarter hours retarded in relation to UTC time. |
55    BroadcastEndTime(OctetString<0, 17>),
56    BroadcastErrorStatus(CommandStatus),
57    /// This field indicates the frequency interval at which
58    /// the broadcasts of a message should be repeated.
59    BroadcastFrequencyInterval(BroadcastFrequencyInterval),
60    BroadcastMessageClass(BroadcastMessageClass),
61    /// This field indicates the number of repeated
62    /// broadcasts of a message requested by the submitter.
63    BroadcastRepNum(BroadcastRepNum),
64    BroadcastServiceGroup(OctetString<1, 255>),
65    CallbackNum(OctetString<4, 19>),
66    CallbackNumAtag(OctetString<0, 65>),
67    CallbackNumPresInd(CallbackNumPresInd),
68    CongestionState(CongestionState),
69    DeliveryFailureReason(DeliveryFailureReason),
70    DestAddrNpCountry(OctetString<1, 5>),
71    DestAddrNpInformation(OctetString<0, 10>),
72    DestAddrNpResolution(DestAddrNpResolution),
73    DestAddrSubunit(AddrSubunit),
74    DestBearerType(BearerType),
75    DestNetworkId(COctetString<7, 66>),
76    DestNetworkType(NetworkType),
77    DestNodeId(OctetString<6, 6>),
78    DestSubaddress(Subaddress),
79    DestTelematicsId(u16),
80    DestPort(u16),
81    DisplayTime(DisplayTime),
82    DpfResult(DpfResult),
83    ItsReplyType(ItsReplyType),
84    ItsSessionInfo(ItsSessionInfo),
85    LanguageIndicator(LanguageIndicator),
86    MessagePayload(MessagePayload),
87    /// This field indicates the current status of the broadcast message.
88    MessageState(MessageState),
89    MoreMessagesToSend(MoreMessagesToSend),
90    MsAvailabilityStatus(MsAvailabilityStatus),
91    MsMsgWaitFacilities(MsMsgWaitFacilities),
92    MsValidity(MsValidity),
93    NetworkErrorCode(NetworkErrorCode),
94    NumberOfMessages(NumberOfMessages),
95    PayloadType(PayloadType),
96    PrivacyIndicator(PrivacyIndicator),
97    QosTimeToLive(u32),
98    ReceiptedMessageId(COctetString<1, 65>),
99    SarMsgRefNum(u16),
100    SarSegmentSeqnum(u8),
101    SarTotalSegments(u8),
102    ScInterfaceVersion(InterfaceVersion),
103    SetDpf(SetDpf),
104    /// Encoded as per [CMT-136]
105    SmsSignal(u16),
106    SourceAddrSubunit(AddrSubunit),
107    SourceBearerType(BearerType),
108    SourceNetworkId(COctetString<7, 66>),
109    SourceNetworkType(NetworkType),
110    SourceNodeId(OctetString<6, 6>),
111    SourcePort(u16),
112    SourceSubaddress(Subaddress),
113    SourceTelematicsId(u16),
114    UserMessageReference(UserMessageReference),
115    UserResponseCode(u8),
116    UssdServiceOp(UssdServiceOp),
117    Other {
118        tag: TlvTag,
119        value: AnyOctetString,
120    },
121}
122
123impl TlvValue {
124    pub const fn tag(&self) -> TlvTag {
125        match self {
126            TlvValue::AdditionalStatusInfoText(_) => TlvTag::AdditionalStatusInfoText,
127            TlvValue::AlertOnMessageDelivery(_) => TlvTag::AlertOnMessageDelivery,
128            TlvValue::BillingIdentification(_) => TlvTag::BillingIdentification,
129            TlvValue::BroadcastAreaIdentifier(_) => TlvTag::BroadcastAreaIdentifier,
130            TlvValue::BroadcastAreaSuccess(_) => TlvTag::BroadcastAreaSuccess,
131            TlvValue::BroadcastContentTypeInfo(_) => TlvTag::BroadcastContentTypeInfo,
132            TlvValue::BroadcastChannelIndicator(_) => TlvTag::BroadcastChannelIndicator,
133            TlvValue::BroadcastContentType(_) => TlvTag::BroadcastContentType,
134            TlvValue::BroadcastEndTime(_) => TlvTag::BroadcastEndTime,
135            TlvValue::BroadcastErrorStatus(_) => TlvTag::BroadcastErrorStatus,
136            TlvValue::BroadcastFrequencyInterval(_) => TlvTag::BroadcastFrequencyInterval,
137            TlvValue::BroadcastMessageClass(_) => TlvTag::BroadcastMessageClass,
138            TlvValue::BroadcastRepNum(_) => TlvTag::BroadcastRepNum,
139            TlvValue::BroadcastServiceGroup(_) => TlvTag::BroadcastServiceGroup,
140            TlvValue::CallbackNum(_) => TlvTag::CallbackNum,
141            TlvValue::CallbackNumAtag(_) => TlvTag::CallbackNumAtag,
142            TlvValue::CallbackNumPresInd(_) => TlvTag::CallbackNumPresInd,
143            TlvValue::CongestionState(_) => TlvTag::CongestionState,
144            TlvValue::DeliveryFailureReason(_) => TlvTag::DeliveryFailureReason,
145            TlvValue::DestAddrNpCountry(_) => TlvTag::DestAddrNpCountry,
146            TlvValue::DestAddrNpInformation(_) => TlvTag::DestAddrNpInformation,
147            TlvValue::DestAddrNpResolution(_) => TlvTag::DestAddrNpResolution,
148            TlvValue::DestAddrSubunit(_) => TlvTag::DestAddrSubunit,
149            TlvValue::DestBearerType(_) => TlvTag::DestBearerType,
150            TlvValue::DestNetworkId(_) => TlvTag::DestNetworkId,
151            TlvValue::DestNetworkType(_) => TlvTag::DestNetworkType,
152            TlvValue::DestNodeId(_) => TlvTag::DestNodeId,
153            TlvValue::DestSubaddress(_) => TlvTag::DestSubaddress,
154            TlvValue::DestTelematicsId(_) => TlvTag::DestTelematicsId,
155            TlvValue::DestPort(_) => TlvTag::DestPort,
156            TlvValue::DisplayTime(_) => TlvTag::DisplayTime,
157            TlvValue::DpfResult(_) => TlvTag::DpfResult,
158            TlvValue::ItsReplyType(_) => TlvTag::ItsReplyType,
159            TlvValue::ItsSessionInfo(_) => TlvTag::ItsSessionInfo,
160            TlvValue::LanguageIndicator(_) => TlvTag::LanguageIndicator,
161            TlvValue::MessagePayload(_) => TlvTag::MessagePayload,
162            TlvValue::MessageState(_) => TlvTag::MessageState,
163            TlvValue::MoreMessagesToSend(_) => TlvTag::MoreMessagesToSend,
164            TlvValue::MsAvailabilityStatus(_) => TlvTag::MsAvailabilityStatus,
165            TlvValue::MsMsgWaitFacilities(_) => TlvTag::MsMsgWaitFacilities,
166            TlvValue::MsValidity(_) => TlvTag::MsValidity,
167            TlvValue::NetworkErrorCode(_) => TlvTag::NetworkErrorCode,
168            TlvValue::NumberOfMessages(_) => TlvTag::NumberOfMessages,
169            TlvValue::PayloadType(_) => TlvTag::PayloadType,
170            TlvValue::PrivacyIndicator(_) => TlvTag::PrivacyIndicator,
171            TlvValue::QosTimeToLive(_) => TlvTag::QosTimeToLive,
172            TlvValue::ReceiptedMessageId(_) => TlvTag::ReceiptedMessageId,
173            TlvValue::SarMsgRefNum(_) => TlvTag::SarMsgRefNum,
174            TlvValue::SarSegmentSeqnum(_) => TlvTag::SarSegmentSeqnum,
175            TlvValue::SarTotalSegments(_) => TlvTag::SarTotalSegments,
176            TlvValue::ScInterfaceVersion(_) => TlvTag::ScInterfaceVersion,
177            TlvValue::SetDpf(_) => TlvTag::SetDpf,
178            TlvValue::SmsSignal(_) => TlvTag::SmsSignal,
179            TlvValue::SourceAddrSubunit(_) => TlvTag::SourceAddrSubunit,
180            TlvValue::SourceBearerType(_) => TlvTag::SourceBearerType,
181            TlvValue::SourceNetworkId(_) => TlvTag::SourceNetworkId,
182            TlvValue::SourceNetworkType(_) => TlvTag::SourceNetworkType,
183            TlvValue::SourceNodeId(_) => TlvTag::SourceNodeId,
184            TlvValue::SourcePort(_) => TlvTag::SourcePort,
185            TlvValue::SourceSubaddress(_) => TlvTag::SourceSubaddress,
186            TlvValue::SourceTelematicsId(_) => TlvTag::SourceTelematicsId,
187            TlvValue::UserMessageReference(_) => TlvTag::UserMessageReference,
188            TlvValue::UserResponseCode(_) => TlvTag::UserResponseCode,
189            TlvValue::UssdServiceOp(_) => TlvTag::UssdServiceOp,
190            TlvValue::Other { tag, .. } => *tag,
191        }
192    }
193}
194
195impl Length for TlvValue {
196    fn length(&self) -> usize {
197        match self {
198            TlvValue::AdditionalStatusInfoText(value) => value.length(),
199            TlvValue::AlertOnMessageDelivery(value) => value.length(),
200            TlvValue::BillingIdentification(value) => value.length(),
201            TlvValue::BroadcastAreaIdentifier(value) => value.length(),
202            TlvValue::BroadcastAreaSuccess(value) => value.length(),
203            TlvValue::BroadcastContentTypeInfo(value) => value.length(),
204            TlvValue::BroadcastChannelIndicator(value) => value.length(),
205            TlvValue::BroadcastContentType(value) => value.length(),
206            TlvValue::BroadcastEndTime(value) => value.length(),
207            TlvValue::BroadcastErrorStatus(value) => value.length(),
208            TlvValue::BroadcastFrequencyInterval(value) => value.length(),
209            TlvValue::BroadcastMessageClass(value) => value.length(),
210            TlvValue::BroadcastRepNum(value) => value.length(),
211            TlvValue::BroadcastServiceGroup(value) => value.length(),
212            TlvValue::CallbackNum(value) => value.length(),
213            TlvValue::CallbackNumAtag(value) => value.length(),
214            TlvValue::CallbackNumPresInd(value) => value.length(),
215            TlvValue::CongestionState(value) => value.length(),
216            TlvValue::DeliveryFailureReason(value) => value.length(),
217            TlvValue::DestAddrNpCountry(value) => value.length(),
218            TlvValue::DestAddrNpInformation(value) => value.length(),
219            TlvValue::DestAddrNpResolution(value) => value.length(),
220            TlvValue::DestAddrSubunit(value) => value.length(),
221            TlvValue::DestBearerType(value) => value.length(),
222            TlvValue::DestNetworkId(value) => value.length(),
223            TlvValue::DestNetworkType(value) => value.length(),
224            TlvValue::DestNodeId(value) => value.length(),
225            TlvValue::DestSubaddress(value) => value.length(),
226            TlvValue::DestTelematicsId(value) => value.length(),
227            TlvValue::DestPort(value) => value.length(),
228            TlvValue::DisplayTime(value) => value.length(),
229            TlvValue::DpfResult(value) => value.length(),
230            TlvValue::ItsReplyType(value) => value.length(),
231            TlvValue::ItsSessionInfo(value) => value.length(),
232            TlvValue::LanguageIndicator(value) => value.length(),
233            TlvValue::MessagePayload(value) => value.length(),
234            TlvValue::MessageState(value) => value.length(),
235            TlvValue::MoreMessagesToSend(value) => value.length(),
236            TlvValue::MsAvailabilityStatus(value) => value.length(),
237            TlvValue::MsMsgWaitFacilities(value) => value.length(),
238            TlvValue::MsValidity(value) => value.length(),
239            TlvValue::NetworkErrorCode(value) => value.length(),
240            TlvValue::NumberOfMessages(value) => value.length(),
241            TlvValue::PayloadType(value) => value.length(),
242            TlvValue::PrivacyIndicator(value) => value.length(),
243            TlvValue::QosTimeToLive(value) => value.length(),
244            TlvValue::ReceiptedMessageId(value) => value.length(),
245            TlvValue::SarMsgRefNum(value) => value.length(),
246            TlvValue::SarSegmentSeqnum(value) => value.length(),
247            TlvValue::SarTotalSegments(value) => value.length(),
248            TlvValue::ScInterfaceVersion(value) => value.length(),
249            TlvValue::SetDpf(value) => value.length(),
250            TlvValue::SmsSignal(value) => value.length(),
251            TlvValue::SourceAddrSubunit(value) => value.length(),
252            TlvValue::SourceBearerType(value) => value.length(),
253            TlvValue::SourceNetworkId(value) => value.length(),
254            TlvValue::SourceNetworkType(value) => value.length(),
255            TlvValue::SourceNodeId(value) => value.length(),
256            TlvValue::SourcePort(value) => value.length(),
257            TlvValue::SourceSubaddress(value) => value.length(),
258            TlvValue::SourceTelematicsId(value) => value.length(),
259            TlvValue::UserMessageReference(value) => value.length(),
260            TlvValue::UserResponseCode(value) => value.length(),
261            TlvValue::UssdServiceOp(value) => value.length(),
262            TlvValue::Other { value, .. } => value.length(),
263        }
264    }
265}
266
267impl crate::encode::Encode for TlvValue {
268    fn encode(&self, dst: &mut [u8]) -> usize {
269        match self {
270            TlvValue::AdditionalStatusInfoText(value) => value.encode(dst),
271            TlvValue::AlertOnMessageDelivery(value) => value.encode(dst),
272            TlvValue::BillingIdentification(value) => value.encode(dst),
273            TlvValue::BroadcastAreaIdentifier(value) => value.encode(dst),
274            TlvValue::BroadcastAreaSuccess(value) => value.encode(dst),
275            TlvValue::BroadcastContentTypeInfo(value) => value.encode(dst),
276            TlvValue::BroadcastChannelIndicator(value) => value.encode(dst),
277            TlvValue::BroadcastContentType(value) => value.encode(dst),
278            TlvValue::BroadcastEndTime(value) => value.encode(dst),
279            TlvValue::BroadcastErrorStatus(value) => value.encode(dst),
280            TlvValue::BroadcastFrequencyInterval(value) => value.encode(dst),
281            TlvValue::BroadcastMessageClass(value) => value.encode(dst),
282            TlvValue::BroadcastRepNum(value) => value.encode(dst),
283            TlvValue::BroadcastServiceGroup(value) => value.encode(dst),
284            TlvValue::CallbackNum(value) => value.encode(dst),
285            TlvValue::CallbackNumAtag(value) => value.encode(dst),
286            TlvValue::CallbackNumPresInd(value) => value.encode(dst),
287            TlvValue::CongestionState(value) => value.encode(dst),
288            TlvValue::DeliveryFailureReason(value) => value.encode(dst),
289            TlvValue::DestAddrNpCountry(value) => value.encode(dst),
290            TlvValue::DestAddrNpInformation(value) => value.encode(dst),
291            TlvValue::DestAddrNpResolution(value) => value.encode(dst),
292            TlvValue::DestAddrSubunit(value) => value.encode(dst),
293            TlvValue::DestBearerType(value) => value.encode(dst),
294            TlvValue::DestNetworkId(value) => value.encode(dst),
295            TlvValue::DestNetworkType(value) => value.encode(dst),
296            TlvValue::DestNodeId(value) => value.encode(dst),
297            TlvValue::DestSubaddress(value) => value.encode(dst),
298            TlvValue::DestTelematicsId(value) => value.encode(dst),
299            TlvValue::DestPort(value) => value.encode(dst),
300            TlvValue::DisplayTime(value) => value.encode(dst),
301            TlvValue::DpfResult(value) => value.encode(dst),
302            TlvValue::ItsReplyType(value) => value.encode(dst),
303            TlvValue::ItsSessionInfo(value) => value.encode(dst),
304            TlvValue::LanguageIndicator(value) => value.encode(dst),
305            TlvValue::MessagePayload(value) => value.encode(dst),
306            TlvValue::MessageState(value) => value.encode(dst),
307            TlvValue::MoreMessagesToSend(value) => value.encode(dst),
308            TlvValue::MsAvailabilityStatus(value) => value.encode(dst),
309            TlvValue::MsMsgWaitFacilities(value) => value.encode(dst),
310            TlvValue::MsValidity(value) => value.encode(dst),
311            TlvValue::NetworkErrorCode(value) => value.encode(dst),
312            TlvValue::NumberOfMessages(value) => value.encode(dst),
313            TlvValue::PayloadType(value) => value.encode(dst),
314            TlvValue::PrivacyIndicator(value) => value.encode(dst),
315            TlvValue::QosTimeToLive(value) => value.encode(dst),
316            TlvValue::ReceiptedMessageId(value) => value.encode(dst),
317            TlvValue::SarMsgRefNum(value) => value.encode(dst),
318            TlvValue::SarSegmentSeqnum(value) => value.encode(dst),
319            TlvValue::SarTotalSegments(value) => value.encode(dst),
320            TlvValue::ScInterfaceVersion(value) => value.encode(dst),
321            TlvValue::SetDpf(value) => value.encode(dst),
322            TlvValue::SmsSignal(value) => value.encode(dst),
323            TlvValue::SourceAddrSubunit(value) => value.encode(dst),
324            TlvValue::SourceBearerType(value) => value.encode(dst),
325            TlvValue::SourceNetworkId(value) => value.encode(dst),
326            TlvValue::SourceNetworkType(value) => value.encode(dst),
327            TlvValue::SourceNodeId(value) => value.encode(dst),
328            TlvValue::SourcePort(value) => value.encode(dst),
329            TlvValue::SourceSubaddress(value) => value.encode(dst),
330            TlvValue::SourceTelematicsId(value) => value.encode(dst),
331            TlvValue::UserMessageReference(value) => value.encode(dst),
332            TlvValue::UserResponseCode(value) => value.encode(dst),
333            TlvValue::UssdServiceOp(value) => value.encode(dst),
334            TlvValue::Other { value, .. } => value.encode(dst),
335        }
336    }
337}
338
339impl crate::encode::owned::Encode for TlvValue {
340    fn encode(&self, dst: &mut bytes::BytesMut) {
341        match self {
342            TlvValue::AdditionalStatusInfoText(value) => value.encode(dst),
343            TlvValue::AlertOnMessageDelivery(value) => value.encode(dst),
344            TlvValue::BillingIdentification(value) => value.encode(dst),
345            TlvValue::BroadcastAreaIdentifier(value) => value.encode(dst),
346            TlvValue::BroadcastAreaSuccess(value) => value.encode(dst),
347            TlvValue::BroadcastContentTypeInfo(value) => value.encode(dst),
348            TlvValue::BroadcastChannelIndicator(value) => value.encode(dst),
349            TlvValue::BroadcastContentType(value) => value.encode(dst),
350            TlvValue::BroadcastEndTime(value) => value.encode(dst),
351            TlvValue::BroadcastErrorStatus(value) => value.encode(dst),
352            TlvValue::BroadcastFrequencyInterval(value) => value.encode(dst),
353            TlvValue::BroadcastMessageClass(value) => value.encode(dst),
354            TlvValue::BroadcastRepNum(value) => value.encode(dst),
355            TlvValue::BroadcastServiceGroup(value) => value.encode(dst),
356            TlvValue::CallbackNum(value) => value.encode(dst),
357            TlvValue::CallbackNumAtag(value) => value.encode(dst),
358            TlvValue::CallbackNumPresInd(value) => value.encode(dst),
359            TlvValue::CongestionState(value) => value.encode(dst),
360            TlvValue::DeliveryFailureReason(value) => value.encode(dst),
361            TlvValue::DestAddrNpCountry(value) => value.encode(dst),
362            TlvValue::DestAddrNpInformation(value) => value.encode(dst),
363            TlvValue::DestAddrNpResolution(value) => value.encode(dst),
364            TlvValue::DestAddrSubunit(value) => value.encode(dst),
365            TlvValue::DestBearerType(value) => value.encode(dst),
366            TlvValue::DestNetworkId(value) => value.encode(dst),
367            TlvValue::DestNetworkType(value) => value.encode(dst),
368            TlvValue::DestNodeId(value) => value.encode(dst),
369            TlvValue::DestSubaddress(value) => value.encode(dst),
370            TlvValue::DestTelematicsId(value) => value.encode(dst),
371            TlvValue::DestPort(value) => value.encode(dst),
372            TlvValue::DisplayTime(value) => value.encode(dst),
373            TlvValue::DpfResult(value) => value.encode(dst),
374            TlvValue::ItsReplyType(value) => value.encode(dst),
375            TlvValue::ItsSessionInfo(value) => value.encode(dst),
376            TlvValue::LanguageIndicator(value) => value.encode(dst),
377            TlvValue::MessagePayload(value) => value.encode(dst),
378            TlvValue::MessageState(value) => value.encode(dst),
379            TlvValue::MoreMessagesToSend(value) => value.encode(dst),
380            TlvValue::MsAvailabilityStatus(value) => value.encode(dst),
381            TlvValue::MsMsgWaitFacilities(value) => value.encode(dst),
382            TlvValue::MsValidity(value) => value.encode(dst),
383            TlvValue::NetworkErrorCode(value) => value.encode(dst),
384            TlvValue::NumberOfMessages(value) => value.encode(dst),
385            TlvValue::PayloadType(value) => value.encode(dst),
386            TlvValue::PrivacyIndicator(value) => value.encode(dst),
387            TlvValue::QosTimeToLive(value) => value.encode(dst),
388            TlvValue::ReceiptedMessageId(value) => value.encode(dst),
389            TlvValue::SarMsgRefNum(value) => value.encode(dst),
390            TlvValue::SarSegmentSeqnum(value) => value.encode(dst),
391            TlvValue::SarTotalSegments(value) => value.encode(dst),
392            TlvValue::ScInterfaceVersion(value) => value.encode(dst),
393            TlvValue::SetDpf(value) => value.encode(dst),
394            TlvValue::SmsSignal(value) => value.encode(dst),
395            TlvValue::SourceAddrSubunit(value) => value.encode(dst),
396            TlvValue::SourceBearerType(value) => value.encode(dst),
397            TlvValue::SourceNetworkId(value) => value.encode(dst),
398            TlvValue::SourceNetworkType(value) => value.encode(dst),
399            TlvValue::SourceNodeId(value) => value.encode(dst),
400            TlvValue::SourcePort(value) => value.encode(dst),
401            TlvValue::SourceSubaddress(value) => value.encode(dst),
402            TlvValue::SourceTelematicsId(value) => value.encode(dst),
403            TlvValue::UserMessageReference(value) => value.encode(dst),
404            TlvValue::UserResponseCode(value) => value.encode(dst),
405            TlvValue::UssdServiceOp(value) => value.encode(dst),
406            TlvValue::Other { value, .. } => value.encode(dst),
407        }
408    }
409}
410
411impl DecodeWithKey for TlvValue {
412    type Key = TlvTag;
413
414    fn decode(
415        key: Self::Key,
416        src: &mut BytesMut,
417        length: usize,
418    ) -> Result<(Self, usize), DecodeError> {
419        let (value, size) = match key {
420            TlvTag::AdditionalStatusInfoText => {
421                Decode::decode(src).map_decoded(Self::AdditionalStatusInfoText)?
422            }
423            TlvTag::AlertOnMessageDelivery => {
424                Decode::decode(src).map_decoded(Self::AlertOnMessageDelivery)?
425            }
426            TlvTag::BillingIdentification => {
427                DecodeWithLength::decode(src, length).map_decoded(Self::BillingIdentification)?
428            }
429            TlvTag::BroadcastAreaIdentifier => {
430                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastAreaIdentifier)?
431            }
432            TlvTag::BroadcastAreaSuccess => {
433                Decode::decode(src).map_decoded(Self::BroadcastAreaSuccess)?
434            }
435            TlvTag::BroadcastContentTypeInfo => {
436                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastContentTypeInfo)?
437            }
438            TlvTag::BroadcastChannelIndicator => {
439                Decode::decode(src).map_decoded(Self::BroadcastChannelIndicator)?
440            }
441            TlvTag::BroadcastContentType => {
442                Decode::decode(src).map_decoded(Self::BroadcastContentType)?
443            }
444            TlvTag::BroadcastEndTime => {
445                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastEndTime)?
446            }
447            TlvTag::BroadcastErrorStatus => {
448                Decode::decode(src).map_decoded(Self::BroadcastErrorStatus)?
449            }
450            TlvTag::BroadcastFrequencyInterval => {
451                Decode::decode(src).map_decoded(Self::BroadcastFrequencyInterval)?
452            }
453            TlvTag::BroadcastMessageClass => {
454                Decode::decode(src).map_decoded(Self::BroadcastMessageClass)?
455            }
456            TlvTag::BroadcastRepNum => Decode::decode(src).map_decoded(Self::BroadcastRepNum)?,
457            TlvTag::BroadcastServiceGroup => {
458                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastServiceGroup)?
459            }
460            TlvTag::CallbackNum => {
461                DecodeWithLength::decode(src, length).map_decoded(Self::CallbackNum)?
462            }
463            TlvTag::CallbackNumAtag => {
464                DecodeWithLength::decode(src, length).map_decoded(Self::CallbackNumAtag)?
465            }
466            TlvTag::CallbackNumPresInd => {
467                Decode::decode(src).map_decoded(Self::CallbackNumPresInd)?
468            }
469            TlvTag::CongestionState => Decode::decode(src).map_decoded(Self::CongestionState)?,
470            TlvTag::DeliveryFailureReason => {
471                Decode::decode(src).map_decoded(Self::DeliveryFailureReason)?
472            }
473            TlvTag::DestAddrNpCountry => {
474                DecodeWithLength::decode(src, length).map_decoded(Self::DestAddrNpCountry)?
475            }
476            TlvTag::DestAddrNpInformation => {
477                DecodeWithLength::decode(src, length).map_decoded(Self::DestAddrNpInformation)?
478            }
479            TlvTag::DestAddrNpResolution => {
480                Decode::decode(src).map_decoded(Self::DestAddrNpResolution)?
481            }
482            TlvTag::DestAddrSubunit => Decode::decode(src).map_decoded(Self::DestAddrSubunit)?,
483            TlvTag::DestBearerType => Decode::decode(src).map_decoded(Self::DestBearerType)?,
484            TlvTag::DestNetworkId => Decode::decode(src).map_decoded(Self::DestNetworkId)?,
485            TlvTag::DestNetworkType => Decode::decode(src).map_decoded(Self::DestNetworkType)?,
486            TlvTag::DestNodeId => {
487                DecodeWithLength::decode(src, length).map_decoded(Self::DestNodeId)?
488            }
489            TlvTag::DestSubaddress => {
490                DecodeWithLength::decode(src, length).map_decoded(Self::DestSubaddress)?
491            }
492            TlvTag::DestTelematicsId => Decode::decode(src).map_decoded(Self::DestTelematicsId)?,
493            TlvTag::DestPort => Decode::decode(src).map_decoded(Self::DestPort)?,
494            TlvTag::DisplayTime => Decode::decode(src).map_decoded(Self::DisplayTime)?,
495            TlvTag::DpfResult => Decode::decode(src).map_decoded(Self::DpfResult)?,
496            TlvTag::ItsReplyType => Decode::decode(src).map_decoded(Self::ItsReplyType)?,
497            TlvTag::ItsSessionInfo => Decode::decode(src).map_decoded(Self::ItsSessionInfo)?,
498            TlvTag::LanguageIndicator => {
499                Decode::decode(src).map_decoded(Self::LanguageIndicator)?
500            }
501            TlvTag::MessagePayload => {
502                DecodeWithLength::decode(src, length).map_decoded(Self::MessagePayload)?
503            }
504            TlvTag::MessageState => Decode::decode(src).map_decoded(Self::MessageState)?,
505            TlvTag::MoreMessagesToSend => {
506                Decode::decode(src).map_decoded(Self::MoreMessagesToSend)?
507            }
508            TlvTag::MsAvailabilityStatus => {
509                Decode::decode(src).map_decoded(Self::MsAvailabilityStatus)?
510            }
511            TlvTag::MsMsgWaitFacilities => {
512                Decode::decode(src).map_decoded(Self::MsMsgWaitFacilities)?
513            }
514            TlvTag::MsValidity => {
515                DecodeWithLength::decode(src, length).map_decoded(Self::MsValidity)?
516            }
517            TlvTag::NetworkErrorCode => Decode::decode(src).map_decoded(Self::NetworkErrorCode)?,
518            TlvTag::NumberOfMessages => Decode::decode(src).map_decoded(Self::NumberOfMessages)?,
519            TlvTag::PayloadType => Decode::decode(src).map_decoded(Self::PayloadType)?,
520            TlvTag::PrivacyIndicator => Decode::decode(src).map_decoded(Self::PrivacyIndicator)?,
521            TlvTag::QosTimeToLive => Decode::decode(src).map_decoded(Self::QosTimeToLive)?,
522            TlvTag::ReceiptedMessageId => {
523                Decode::decode(src).map_decoded(Self::ReceiptedMessageId)?
524            }
525            TlvTag::SarMsgRefNum => Decode::decode(src).map_decoded(Self::SarMsgRefNum)?,
526            TlvTag::SarSegmentSeqnum => Decode::decode(src).map_decoded(Self::SarSegmentSeqnum)?,
527            TlvTag::SarTotalSegments => Decode::decode(src).map_decoded(Self::SarTotalSegments)?,
528            TlvTag::ScInterfaceVersion => {
529                Decode::decode(src).map_decoded(Self::ScInterfaceVersion)?
530            }
531            TlvTag::SetDpf => Decode::decode(src).map_decoded(Self::SetDpf)?,
532            TlvTag::SmsSignal => Decode::decode(src).map_decoded(Self::SmsSignal)?,
533            TlvTag::SourceAddrSubunit => {
534                Decode::decode(src).map_decoded(Self::SourceAddrSubunit)?
535            }
536            TlvTag::SourceBearerType => Decode::decode(src).map_decoded(Self::SourceBearerType)?,
537            TlvTag::SourceNetworkId => Decode::decode(src).map_decoded(Self::SourceNetworkId)?,
538            TlvTag::SourceNetworkType => {
539                Decode::decode(src).map_decoded(Self::SourceNetworkType)?
540            }
541            TlvTag::SourceNodeId => {
542                DecodeWithLength::decode(src, length).map_decoded(Self::SourceNodeId)?
543            }
544            TlvTag::SourcePort => Decode::decode(src).map_decoded(Self::SourcePort)?,
545            TlvTag::SourceSubaddress => {
546                DecodeWithLength::decode(src, length).map_decoded(Self::SourceSubaddress)?
547            }
548            TlvTag::SourceTelematicsId => {
549                Decode::decode(src).map_decoded(Self::SourceTelematicsId)?
550            }
551            TlvTag::UserMessageReference => {
552                Decode::decode(src).map_decoded(Self::UserMessageReference)?
553            }
554            TlvTag::UserResponseCode => Decode::decode(src).map_decoded(Self::UserResponseCode)?,
555            TlvTag::UssdServiceOp => Decode::decode(src).map_decoded(Self::UssdServiceOp)?,
556            TlvTag::Other(other) => {
557                DecodeWithLength::decode(src, length).map_decoded(|value| TlvValue::Other {
558                    tag: TlvTag::Other(other),
559                    value,
560                })?
561            }
562        };
563
564        Ok((value, size))
565    }
566}