rusmpp_core/tlvs/borrowed/
value.rs

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