rusmpp-core 0.4.0

A Rust SMPP library.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
use bytes::BytesMut;

use crate::{
    CommandStatus,
    decode::{
        DecodeError, DecodeResultExt,
        owned::{Decode, DecodeWithKey, DecodeWithLength},
    },
    encode::Length,
    tlvs::TlvTag,
    types::owned::{AnyOctetString, COctetString, OctetString},
    values::{owned::*, *},
};

/// See module level documentation.
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(::serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize-unchecked", derive(::serde::Deserialize))]
pub enum TlvValue {
    AdditionalStatusInfoText(COctetString<1, 256>),
    AlertOnMessageDelivery(AlertOnMessageDelivery),
    BillingIdentification(OctetString<0, 1024>),
    /// Identifies one or more target Broadcast Area(s) for which the
    /// status information applies.
    ///
    /// The number of instances of this parameter will be exactly equal
    /// to the number of occurrences of the broadcast_area_identifiers
    /// parameter in the corresponding broadcast_sm.
    BroadcastAreaIdentifier(BroadcastAreaIdentifier),
    /// The success rate indicator, defined as the ratio of the
    /// number of BTSs that accepted the message and the total
    /// number of BTSs that should have accepted the message, for
    /// a particular broadcast_area_identifier.
    BroadcastAreaSuccess(BroadcastAreaSuccess),
    BroadcastContentTypeInfo(OctetString<0, 255>),
    BroadcastChannelIndicator(BroadcastChannelIndicator),
    /// Specifies the content type of the message.
    BroadcastContentType(BroadcastContentType),
    /// Absolute time is formatted as a 16-character string (encoded as a 17-octet C-octet String)
    /// “YYMMDDhhmmsstnnp” where:
    ///
    /// | Digits | Meaning |
    /// |--------|---------|
    /// | ‘YY’   | last two digits of the year (00-99)   |
    /// | ‘MM’   | month (01-12)                         |
    /// | ‘DD’   | day (01-31)                           |
    /// | ‘hh’   | hour (00-23)                          |
    /// | ‘mm’   | minute (00-59)                        |
    /// | ‘ss’   | second (00-59)                        |
    /// | ‘t’    | tenths of second (0-9)                |
    /// | ‘nn’   | time difference in quarter hours between local time (as expressed in the first 13 octets) and UTC (Universal Time Constant) time (00-48). |
    /// | ‘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. |
    BroadcastEndTime(OctetString<0, 17>),
    BroadcastErrorStatus(CommandStatus),
    /// This field indicates the frequency interval at which
    /// the broadcasts of a message should be repeated.
    BroadcastFrequencyInterval(BroadcastFrequencyInterval),
    BroadcastMessageClass(BroadcastMessageClass),
    /// This field indicates the number of repeated
    /// broadcasts of a message requested by the submitter.
    BroadcastRepNum(BroadcastRepNum),
    BroadcastServiceGroup(OctetString<1, 255>),
    CallbackNum(OctetString<4, 19>),
    CallbackNumAtag(OctetString<0, 65>),
    CallbackNumPresInd(CallbackNumPresInd),
    CongestionState(CongestionState),
    DeliveryFailureReason(DeliveryFailureReason),
    DestAddrNpCountry(OctetString<1, 5>),
    DestAddrNpInformation(OctetString<0, 10>),
    DestAddrNpResolution(DestAddrNpResolution),
    DestAddrSubunit(AddrSubunit),
    DestBearerType(BearerType),
    DestNetworkId(COctetString<7, 66>),
    DestNetworkType(NetworkType),
    DestNodeId(OctetString<6, 6>),
    DestSubaddress(Subaddress),
    DestTelematicsId(u16),
    DestPort(u16),
    DisplayTime(DisplayTime),
    DpfResult(DpfResult),
    ItsReplyType(ItsReplyType),
    ItsSessionInfo(ItsSessionInfo),
    LanguageIndicator(LanguageIndicator),
    MessagePayload(MessagePayload),
    /// This field indicates the current status of the broadcast message.
    MessageState(MessageState),
    MoreMessagesToSend(MoreMessagesToSend),
    MsAvailabilityStatus(MsAvailabilityStatus),
    MsMsgWaitFacilities(MsMsgWaitFacilities),
    MsValidity(MsValidity),
    NetworkErrorCode(NetworkErrorCode),
    NumberOfMessages(NumberOfMessages),
    PayloadType(PayloadType),
    PrivacyIndicator(PrivacyIndicator),
    QosTimeToLive(u32),
    ReceiptedMessageId(COctetString<1, 65>),
    SarMsgRefNum(u16),
    SarSegmentSeqnum(u8),
    SarTotalSegments(u8),
    ScInterfaceVersion(InterfaceVersion),
    SetDpf(SetDpf),
    /// Encoded as per [CMT-136]
    SmsSignal(u16),
    SourceAddrSubunit(AddrSubunit),
    SourceBearerType(BearerType),
    SourceNetworkId(COctetString<7, 66>),
    SourceNetworkType(NetworkType),
    SourceNodeId(OctetString<6, 6>),
    SourcePort(u16),
    SourceSubaddress(Subaddress),
    SourceTelematicsId(u16),
    UserMessageReference(UserMessageReference),
    UserResponseCode(u8),
    UssdServiceOp(UssdServiceOp),
    Other {
        tag: TlvTag,
        value: AnyOctetString,
    },
}

impl TlvValue {
    pub const fn tag(&self) -> TlvTag {
        match self {
            TlvValue::AdditionalStatusInfoText(_) => TlvTag::AdditionalStatusInfoText,
            TlvValue::AlertOnMessageDelivery(_) => TlvTag::AlertOnMessageDelivery,
            TlvValue::BillingIdentification(_) => TlvTag::BillingIdentification,
            TlvValue::BroadcastAreaIdentifier(_) => TlvTag::BroadcastAreaIdentifier,
            TlvValue::BroadcastAreaSuccess(_) => TlvTag::BroadcastAreaSuccess,
            TlvValue::BroadcastContentTypeInfo(_) => TlvTag::BroadcastContentTypeInfo,
            TlvValue::BroadcastChannelIndicator(_) => TlvTag::BroadcastChannelIndicator,
            TlvValue::BroadcastContentType(_) => TlvTag::BroadcastContentType,
            TlvValue::BroadcastEndTime(_) => TlvTag::BroadcastEndTime,
            TlvValue::BroadcastErrorStatus(_) => TlvTag::BroadcastErrorStatus,
            TlvValue::BroadcastFrequencyInterval(_) => TlvTag::BroadcastFrequencyInterval,
            TlvValue::BroadcastMessageClass(_) => TlvTag::BroadcastMessageClass,
            TlvValue::BroadcastRepNum(_) => TlvTag::BroadcastRepNum,
            TlvValue::BroadcastServiceGroup(_) => TlvTag::BroadcastServiceGroup,
            TlvValue::CallbackNum(_) => TlvTag::CallbackNum,
            TlvValue::CallbackNumAtag(_) => TlvTag::CallbackNumAtag,
            TlvValue::CallbackNumPresInd(_) => TlvTag::CallbackNumPresInd,
            TlvValue::CongestionState(_) => TlvTag::CongestionState,
            TlvValue::DeliveryFailureReason(_) => TlvTag::DeliveryFailureReason,
            TlvValue::DestAddrNpCountry(_) => TlvTag::DestAddrNpCountry,
            TlvValue::DestAddrNpInformation(_) => TlvTag::DestAddrNpInformation,
            TlvValue::DestAddrNpResolution(_) => TlvTag::DestAddrNpResolution,
            TlvValue::DestAddrSubunit(_) => TlvTag::DestAddrSubunit,
            TlvValue::DestBearerType(_) => TlvTag::DestBearerType,
            TlvValue::DestNetworkId(_) => TlvTag::DestNetworkId,
            TlvValue::DestNetworkType(_) => TlvTag::DestNetworkType,
            TlvValue::DestNodeId(_) => TlvTag::DestNodeId,
            TlvValue::DestSubaddress(_) => TlvTag::DestSubaddress,
            TlvValue::DestTelematicsId(_) => TlvTag::DestTelematicsId,
            TlvValue::DestPort(_) => TlvTag::DestPort,
            TlvValue::DisplayTime(_) => TlvTag::DisplayTime,
            TlvValue::DpfResult(_) => TlvTag::DpfResult,
            TlvValue::ItsReplyType(_) => TlvTag::ItsReplyType,
            TlvValue::ItsSessionInfo(_) => TlvTag::ItsSessionInfo,
            TlvValue::LanguageIndicator(_) => TlvTag::LanguageIndicator,
            TlvValue::MessagePayload(_) => TlvTag::MessagePayload,
            TlvValue::MessageState(_) => TlvTag::MessageState,
            TlvValue::MoreMessagesToSend(_) => TlvTag::MoreMessagesToSend,
            TlvValue::MsAvailabilityStatus(_) => TlvTag::MsAvailabilityStatus,
            TlvValue::MsMsgWaitFacilities(_) => TlvTag::MsMsgWaitFacilities,
            TlvValue::MsValidity(_) => TlvTag::MsValidity,
            TlvValue::NetworkErrorCode(_) => TlvTag::NetworkErrorCode,
            TlvValue::NumberOfMessages(_) => TlvTag::NumberOfMessages,
            TlvValue::PayloadType(_) => TlvTag::PayloadType,
            TlvValue::PrivacyIndicator(_) => TlvTag::PrivacyIndicator,
            TlvValue::QosTimeToLive(_) => TlvTag::QosTimeToLive,
            TlvValue::ReceiptedMessageId(_) => TlvTag::ReceiptedMessageId,
            TlvValue::SarMsgRefNum(_) => TlvTag::SarMsgRefNum,
            TlvValue::SarSegmentSeqnum(_) => TlvTag::SarSegmentSeqnum,
            TlvValue::SarTotalSegments(_) => TlvTag::SarTotalSegments,
            TlvValue::ScInterfaceVersion(_) => TlvTag::ScInterfaceVersion,
            TlvValue::SetDpf(_) => TlvTag::SetDpf,
            TlvValue::SmsSignal(_) => TlvTag::SmsSignal,
            TlvValue::SourceAddrSubunit(_) => TlvTag::SourceAddrSubunit,
            TlvValue::SourceBearerType(_) => TlvTag::SourceBearerType,
            TlvValue::SourceNetworkId(_) => TlvTag::SourceNetworkId,
            TlvValue::SourceNetworkType(_) => TlvTag::SourceNetworkType,
            TlvValue::SourceNodeId(_) => TlvTag::SourceNodeId,
            TlvValue::SourcePort(_) => TlvTag::SourcePort,
            TlvValue::SourceSubaddress(_) => TlvTag::SourceSubaddress,
            TlvValue::SourceTelematicsId(_) => TlvTag::SourceTelematicsId,
            TlvValue::UserMessageReference(_) => TlvTag::UserMessageReference,
            TlvValue::UserResponseCode(_) => TlvTag::UserResponseCode,
            TlvValue::UssdServiceOp(_) => TlvTag::UssdServiceOp,
            TlvValue::Other { tag, .. } => *tag,
        }
    }
}

impl Length for TlvValue {
    fn length(&self) -> usize {
        match self {
            TlvValue::AdditionalStatusInfoText(value) => value.length(),
            TlvValue::AlertOnMessageDelivery(value) => value.length(),
            TlvValue::BillingIdentification(value) => value.length(),
            TlvValue::BroadcastAreaIdentifier(value) => value.length(),
            TlvValue::BroadcastAreaSuccess(value) => value.length(),
            TlvValue::BroadcastContentTypeInfo(value) => value.length(),
            TlvValue::BroadcastChannelIndicator(value) => value.length(),
            TlvValue::BroadcastContentType(value) => value.length(),
            TlvValue::BroadcastEndTime(value) => value.length(),
            TlvValue::BroadcastErrorStatus(value) => value.length(),
            TlvValue::BroadcastFrequencyInterval(value) => value.length(),
            TlvValue::BroadcastMessageClass(value) => value.length(),
            TlvValue::BroadcastRepNum(value) => value.length(),
            TlvValue::BroadcastServiceGroup(value) => value.length(),
            TlvValue::CallbackNum(value) => value.length(),
            TlvValue::CallbackNumAtag(value) => value.length(),
            TlvValue::CallbackNumPresInd(value) => value.length(),
            TlvValue::CongestionState(value) => value.length(),
            TlvValue::DeliveryFailureReason(value) => value.length(),
            TlvValue::DestAddrNpCountry(value) => value.length(),
            TlvValue::DestAddrNpInformation(value) => value.length(),
            TlvValue::DestAddrNpResolution(value) => value.length(),
            TlvValue::DestAddrSubunit(value) => value.length(),
            TlvValue::DestBearerType(value) => value.length(),
            TlvValue::DestNetworkId(value) => value.length(),
            TlvValue::DestNetworkType(value) => value.length(),
            TlvValue::DestNodeId(value) => value.length(),
            TlvValue::DestSubaddress(value) => value.length(),
            TlvValue::DestTelematicsId(value) => value.length(),
            TlvValue::DestPort(value) => value.length(),
            TlvValue::DisplayTime(value) => value.length(),
            TlvValue::DpfResult(value) => value.length(),
            TlvValue::ItsReplyType(value) => value.length(),
            TlvValue::ItsSessionInfo(value) => value.length(),
            TlvValue::LanguageIndicator(value) => value.length(),
            TlvValue::MessagePayload(value) => value.length(),
            TlvValue::MessageState(value) => value.length(),
            TlvValue::MoreMessagesToSend(value) => value.length(),
            TlvValue::MsAvailabilityStatus(value) => value.length(),
            TlvValue::MsMsgWaitFacilities(value) => value.length(),
            TlvValue::MsValidity(value) => value.length(),
            TlvValue::NetworkErrorCode(value) => value.length(),
            TlvValue::NumberOfMessages(value) => value.length(),
            TlvValue::PayloadType(value) => value.length(),
            TlvValue::PrivacyIndicator(value) => value.length(),
            TlvValue::QosTimeToLive(value) => value.length(),
            TlvValue::ReceiptedMessageId(value) => value.length(),
            TlvValue::SarMsgRefNum(value) => value.length(),
            TlvValue::SarSegmentSeqnum(value) => value.length(),
            TlvValue::SarTotalSegments(value) => value.length(),
            TlvValue::ScInterfaceVersion(value) => value.length(),
            TlvValue::SetDpf(value) => value.length(),
            TlvValue::SmsSignal(value) => value.length(),
            TlvValue::SourceAddrSubunit(value) => value.length(),
            TlvValue::SourceBearerType(value) => value.length(),
            TlvValue::SourceNetworkId(value) => value.length(),
            TlvValue::SourceNetworkType(value) => value.length(),
            TlvValue::SourceNodeId(value) => value.length(),
            TlvValue::SourcePort(value) => value.length(),
            TlvValue::SourceSubaddress(value) => value.length(),
            TlvValue::SourceTelematicsId(value) => value.length(),
            TlvValue::UserMessageReference(value) => value.length(),
            TlvValue::UserResponseCode(value) => value.length(),
            TlvValue::UssdServiceOp(value) => value.length(),
            TlvValue::Other { value, .. } => value.length(),
        }
    }
}

impl crate::encode::Encode for TlvValue {
    fn encode(&self, dst: &mut [u8]) -> usize {
        match self {
            TlvValue::AdditionalStatusInfoText(value) => value.encode(dst),
            TlvValue::AlertOnMessageDelivery(value) => value.encode(dst),
            TlvValue::BillingIdentification(value) => value.encode(dst),
            TlvValue::BroadcastAreaIdentifier(value) => value.encode(dst),
            TlvValue::BroadcastAreaSuccess(value) => value.encode(dst),
            TlvValue::BroadcastContentTypeInfo(value) => value.encode(dst),
            TlvValue::BroadcastChannelIndicator(value) => value.encode(dst),
            TlvValue::BroadcastContentType(value) => value.encode(dst),
            TlvValue::BroadcastEndTime(value) => value.encode(dst),
            TlvValue::BroadcastErrorStatus(value) => value.encode(dst),
            TlvValue::BroadcastFrequencyInterval(value) => value.encode(dst),
            TlvValue::BroadcastMessageClass(value) => value.encode(dst),
            TlvValue::BroadcastRepNum(value) => value.encode(dst),
            TlvValue::BroadcastServiceGroup(value) => value.encode(dst),
            TlvValue::CallbackNum(value) => value.encode(dst),
            TlvValue::CallbackNumAtag(value) => value.encode(dst),
            TlvValue::CallbackNumPresInd(value) => value.encode(dst),
            TlvValue::CongestionState(value) => value.encode(dst),
            TlvValue::DeliveryFailureReason(value) => value.encode(dst),
            TlvValue::DestAddrNpCountry(value) => value.encode(dst),
            TlvValue::DestAddrNpInformation(value) => value.encode(dst),
            TlvValue::DestAddrNpResolution(value) => value.encode(dst),
            TlvValue::DestAddrSubunit(value) => value.encode(dst),
            TlvValue::DestBearerType(value) => value.encode(dst),
            TlvValue::DestNetworkId(value) => value.encode(dst),
            TlvValue::DestNetworkType(value) => value.encode(dst),
            TlvValue::DestNodeId(value) => value.encode(dst),
            TlvValue::DestSubaddress(value) => value.encode(dst),
            TlvValue::DestTelematicsId(value) => value.encode(dst),
            TlvValue::DestPort(value) => value.encode(dst),
            TlvValue::DisplayTime(value) => value.encode(dst),
            TlvValue::DpfResult(value) => value.encode(dst),
            TlvValue::ItsReplyType(value) => value.encode(dst),
            TlvValue::ItsSessionInfo(value) => value.encode(dst),
            TlvValue::LanguageIndicator(value) => value.encode(dst),
            TlvValue::MessagePayload(value) => value.encode(dst),
            TlvValue::MessageState(value) => value.encode(dst),
            TlvValue::MoreMessagesToSend(value) => value.encode(dst),
            TlvValue::MsAvailabilityStatus(value) => value.encode(dst),
            TlvValue::MsMsgWaitFacilities(value) => value.encode(dst),
            TlvValue::MsValidity(value) => value.encode(dst),
            TlvValue::NetworkErrorCode(value) => value.encode(dst),
            TlvValue::NumberOfMessages(value) => value.encode(dst),
            TlvValue::PayloadType(value) => value.encode(dst),
            TlvValue::PrivacyIndicator(value) => value.encode(dst),
            TlvValue::QosTimeToLive(value) => value.encode(dst),
            TlvValue::ReceiptedMessageId(value) => value.encode(dst),
            TlvValue::SarMsgRefNum(value) => value.encode(dst),
            TlvValue::SarSegmentSeqnum(value) => value.encode(dst),
            TlvValue::SarTotalSegments(value) => value.encode(dst),
            TlvValue::ScInterfaceVersion(value) => value.encode(dst),
            TlvValue::SetDpf(value) => value.encode(dst),
            TlvValue::SmsSignal(value) => value.encode(dst),
            TlvValue::SourceAddrSubunit(value) => value.encode(dst),
            TlvValue::SourceBearerType(value) => value.encode(dst),
            TlvValue::SourceNetworkId(value) => value.encode(dst),
            TlvValue::SourceNetworkType(value) => value.encode(dst),
            TlvValue::SourceNodeId(value) => value.encode(dst),
            TlvValue::SourcePort(value) => value.encode(dst),
            TlvValue::SourceSubaddress(value) => value.encode(dst),
            TlvValue::SourceTelematicsId(value) => value.encode(dst),
            TlvValue::UserMessageReference(value) => value.encode(dst),
            TlvValue::UserResponseCode(value) => value.encode(dst),
            TlvValue::UssdServiceOp(value) => value.encode(dst),
            TlvValue::Other { value, .. } => value.encode(dst),
        }
    }
}

impl crate::encode::owned::Encode for TlvValue {
    fn encode(&self, dst: &mut bytes::BytesMut) {
        match self {
            TlvValue::AdditionalStatusInfoText(value) => value.encode(dst),
            TlvValue::AlertOnMessageDelivery(value) => value.encode(dst),
            TlvValue::BillingIdentification(value) => value.encode(dst),
            TlvValue::BroadcastAreaIdentifier(value) => value.encode(dst),
            TlvValue::BroadcastAreaSuccess(value) => value.encode(dst),
            TlvValue::BroadcastContentTypeInfo(value) => value.encode(dst),
            TlvValue::BroadcastChannelIndicator(value) => value.encode(dst),
            TlvValue::BroadcastContentType(value) => value.encode(dst),
            TlvValue::BroadcastEndTime(value) => value.encode(dst),
            TlvValue::BroadcastErrorStatus(value) => value.encode(dst),
            TlvValue::BroadcastFrequencyInterval(value) => value.encode(dst),
            TlvValue::BroadcastMessageClass(value) => value.encode(dst),
            TlvValue::BroadcastRepNum(value) => value.encode(dst),
            TlvValue::BroadcastServiceGroup(value) => value.encode(dst),
            TlvValue::CallbackNum(value) => value.encode(dst),
            TlvValue::CallbackNumAtag(value) => value.encode(dst),
            TlvValue::CallbackNumPresInd(value) => value.encode(dst),
            TlvValue::CongestionState(value) => value.encode(dst),
            TlvValue::DeliveryFailureReason(value) => value.encode(dst),
            TlvValue::DestAddrNpCountry(value) => value.encode(dst),
            TlvValue::DestAddrNpInformation(value) => value.encode(dst),
            TlvValue::DestAddrNpResolution(value) => value.encode(dst),
            TlvValue::DestAddrSubunit(value) => value.encode(dst),
            TlvValue::DestBearerType(value) => value.encode(dst),
            TlvValue::DestNetworkId(value) => value.encode(dst),
            TlvValue::DestNetworkType(value) => value.encode(dst),
            TlvValue::DestNodeId(value) => value.encode(dst),
            TlvValue::DestSubaddress(value) => value.encode(dst),
            TlvValue::DestTelematicsId(value) => value.encode(dst),
            TlvValue::DestPort(value) => value.encode(dst),
            TlvValue::DisplayTime(value) => value.encode(dst),
            TlvValue::DpfResult(value) => value.encode(dst),
            TlvValue::ItsReplyType(value) => value.encode(dst),
            TlvValue::ItsSessionInfo(value) => value.encode(dst),
            TlvValue::LanguageIndicator(value) => value.encode(dst),
            TlvValue::MessagePayload(value) => value.encode(dst),
            TlvValue::MessageState(value) => value.encode(dst),
            TlvValue::MoreMessagesToSend(value) => value.encode(dst),
            TlvValue::MsAvailabilityStatus(value) => value.encode(dst),
            TlvValue::MsMsgWaitFacilities(value) => value.encode(dst),
            TlvValue::MsValidity(value) => value.encode(dst),
            TlvValue::NetworkErrorCode(value) => value.encode(dst),
            TlvValue::NumberOfMessages(value) => value.encode(dst),
            TlvValue::PayloadType(value) => value.encode(dst),
            TlvValue::PrivacyIndicator(value) => value.encode(dst),
            TlvValue::QosTimeToLive(value) => value.encode(dst),
            TlvValue::ReceiptedMessageId(value) => value.encode(dst),
            TlvValue::SarMsgRefNum(value) => value.encode(dst),
            TlvValue::SarSegmentSeqnum(value) => value.encode(dst),
            TlvValue::SarTotalSegments(value) => value.encode(dst),
            TlvValue::ScInterfaceVersion(value) => value.encode(dst),
            TlvValue::SetDpf(value) => value.encode(dst),
            TlvValue::SmsSignal(value) => value.encode(dst),
            TlvValue::SourceAddrSubunit(value) => value.encode(dst),
            TlvValue::SourceBearerType(value) => value.encode(dst),
            TlvValue::SourceNetworkId(value) => value.encode(dst),
            TlvValue::SourceNetworkType(value) => value.encode(dst),
            TlvValue::SourceNodeId(value) => value.encode(dst),
            TlvValue::SourcePort(value) => value.encode(dst),
            TlvValue::SourceSubaddress(value) => value.encode(dst),
            TlvValue::SourceTelematicsId(value) => value.encode(dst),
            TlvValue::UserMessageReference(value) => value.encode(dst),
            TlvValue::UserResponseCode(value) => value.encode(dst),
            TlvValue::UssdServiceOp(value) => value.encode(dst),
            TlvValue::Other { value, .. } => value.encode(dst),
        }
    }
}

impl DecodeWithKey for TlvValue {
    type Key = TlvTag;

    fn decode(
        key: Self::Key,
        src: &mut BytesMut,
        length: usize,
    ) -> Result<(Self, usize), DecodeError> {
        let (value, size) = match key {
            TlvTag::AdditionalStatusInfoText => {
                Decode::decode(src).map_decoded(Self::AdditionalStatusInfoText)?
            }
            TlvTag::AlertOnMessageDelivery => {
                Decode::decode(src).map_decoded(Self::AlertOnMessageDelivery)?
            }
            TlvTag::BillingIdentification => {
                DecodeWithLength::decode(src, length).map_decoded(Self::BillingIdentification)?
            }
            TlvTag::BroadcastAreaIdentifier => {
                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastAreaIdentifier)?
            }
            TlvTag::BroadcastAreaSuccess => {
                Decode::decode(src).map_decoded(Self::BroadcastAreaSuccess)?
            }
            TlvTag::BroadcastContentTypeInfo => {
                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastContentTypeInfo)?
            }
            TlvTag::BroadcastChannelIndicator => {
                Decode::decode(src).map_decoded(Self::BroadcastChannelIndicator)?
            }
            TlvTag::BroadcastContentType => {
                Decode::decode(src).map_decoded(Self::BroadcastContentType)?
            }
            TlvTag::BroadcastEndTime => {
                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastEndTime)?
            }
            TlvTag::BroadcastErrorStatus => {
                Decode::decode(src).map_decoded(Self::BroadcastErrorStatus)?
            }
            TlvTag::BroadcastFrequencyInterval => {
                Decode::decode(src).map_decoded(Self::BroadcastFrequencyInterval)?
            }
            TlvTag::BroadcastMessageClass => {
                Decode::decode(src).map_decoded(Self::BroadcastMessageClass)?
            }
            TlvTag::BroadcastRepNum => Decode::decode(src).map_decoded(Self::BroadcastRepNum)?,
            TlvTag::BroadcastServiceGroup => {
                DecodeWithLength::decode(src, length).map_decoded(Self::BroadcastServiceGroup)?
            }
            TlvTag::CallbackNum => {
                DecodeWithLength::decode(src, length).map_decoded(Self::CallbackNum)?
            }
            TlvTag::CallbackNumAtag => {
                DecodeWithLength::decode(src, length).map_decoded(Self::CallbackNumAtag)?
            }
            TlvTag::CallbackNumPresInd => {
                Decode::decode(src).map_decoded(Self::CallbackNumPresInd)?
            }
            TlvTag::CongestionState => Decode::decode(src).map_decoded(Self::CongestionState)?,
            TlvTag::DeliveryFailureReason => {
                Decode::decode(src).map_decoded(Self::DeliveryFailureReason)?
            }
            TlvTag::DestAddrNpCountry => {
                DecodeWithLength::decode(src, length).map_decoded(Self::DestAddrNpCountry)?
            }
            TlvTag::DestAddrNpInformation => {
                DecodeWithLength::decode(src, length).map_decoded(Self::DestAddrNpInformation)?
            }
            TlvTag::DestAddrNpResolution => {
                Decode::decode(src).map_decoded(Self::DestAddrNpResolution)?
            }
            TlvTag::DestAddrSubunit => Decode::decode(src).map_decoded(Self::DestAddrSubunit)?,
            TlvTag::DestBearerType => Decode::decode(src).map_decoded(Self::DestBearerType)?,
            TlvTag::DestNetworkId => Decode::decode(src).map_decoded(Self::DestNetworkId)?,
            TlvTag::DestNetworkType => Decode::decode(src).map_decoded(Self::DestNetworkType)?,
            TlvTag::DestNodeId => {
                DecodeWithLength::decode(src, length).map_decoded(Self::DestNodeId)?
            }
            TlvTag::DestSubaddress => {
                DecodeWithLength::decode(src, length).map_decoded(Self::DestSubaddress)?
            }
            TlvTag::DestTelematicsId => Decode::decode(src).map_decoded(Self::DestTelematicsId)?,
            TlvTag::DestPort => Decode::decode(src).map_decoded(Self::DestPort)?,
            TlvTag::DisplayTime => Decode::decode(src).map_decoded(Self::DisplayTime)?,
            TlvTag::DpfResult => Decode::decode(src).map_decoded(Self::DpfResult)?,
            TlvTag::ItsReplyType => Decode::decode(src).map_decoded(Self::ItsReplyType)?,
            TlvTag::ItsSessionInfo => Decode::decode(src).map_decoded(Self::ItsSessionInfo)?,
            TlvTag::LanguageIndicator => {
                Decode::decode(src).map_decoded(Self::LanguageIndicator)?
            }
            TlvTag::MessagePayload => {
                DecodeWithLength::decode(src, length).map_decoded(Self::MessagePayload)?
            }
            TlvTag::MessageState => Decode::decode(src).map_decoded(Self::MessageState)?,
            TlvTag::MoreMessagesToSend => {
                Decode::decode(src).map_decoded(Self::MoreMessagesToSend)?
            }
            TlvTag::MsAvailabilityStatus => {
                Decode::decode(src).map_decoded(Self::MsAvailabilityStatus)?
            }
            TlvTag::MsMsgWaitFacilities => {
                Decode::decode(src).map_decoded(Self::MsMsgWaitFacilities)?
            }
            TlvTag::MsValidity => {
                DecodeWithLength::decode(src, length).map_decoded(Self::MsValidity)?
            }
            TlvTag::NetworkErrorCode => Decode::decode(src).map_decoded(Self::NetworkErrorCode)?,
            TlvTag::NumberOfMessages => Decode::decode(src).map_decoded(Self::NumberOfMessages)?,
            TlvTag::PayloadType => Decode::decode(src).map_decoded(Self::PayloadType)?,
            TlvTag::PrivacyIndicator => Decode::decode(src).map_decoded(Self::PrivacyIndicator)?,
            TlvTag::QosTimeToLive => Decode::decode(src).map_decoded(Self::QosTimeToLive)?,
            TlvTag::ReceiptedMessageId => {
                Decode::decode(src).map_decoded(Self::ReceiptedMessageId)?
            }
            TlvTag::SarMsgRefNum => Decode::decode(src).map_decoded(Self::SarMsgRefNum)?,
            TlvTag::SarSegmentSeqnum => Decode::decode(src).map_decoded(Self::SarSegmentSeqnum)?,
            TlvTag::SarTotalSegments => Decode::decode(src).map_decoded(Self::SarTotalSegments)?,
            TlvTag::ScInterfaceVersion => {
                Decode::decode(src).map_decoded(Self::ScInterfaceVersion)?
            }
            TlvTag::SetDpf => Decode::decode(src).map_decoded(Self::SetDpf)?,
            TlvTag::SmsSignal => Decode::decode(src).map_decoded(Self::SmsSignal)?,
            TlvTag::SourceAddrSubunit => {
                Decode::decode(src).map_decoded(Self::SourceAddrSubunit)?
            }
            TlvTag::SourceBearerType => Decode::decode(src).map_decoded(Self::SourceBearerType)?,
            TlvTag::SourceNetworkId => Decode::decode(src).map_decoded(Self::SourceNetworkId)?,
            TlvTag::SourceNetworkType => {
                Decode::decode(src).map_decoded(Self::SourceNetworkType)?
            }
            TlvTag::SourceNodeId => {
                DecodeWithLength::decode(src, length).map_decoded(Self::SourceNodeId)?
            }
            TlvTag::SourcePort => Decode::decode(src).map_decoded(Self::SourcePort)?,
            TlvTag::SourceSubaddress => {
                DecodeWithLength::decode(src, length).map_decoded(Self::SourceSubaddress)?
            }
            TlvTag::SourceTelematicsId => {
                Decode::decode(src).map_decoded(Self::SourceTelematicsId)?
            }
            TlvTag::UserMessageReference => {
                Decode::decode(src).map_decoded(Self::UserMessageReference)?
            }
            TlvTag::UserResponseCode => Decode::decode(src).map_decoded(Self::UserResponseCode)?,
            TlvTag::UssdServiceOp => Decode::decode(src).map_decoded(Self::UssdServiceOp)?,
            TlvTag::Other(other) => {
                DecodeWithLength::decode(src, length).map_decoded(|value| TlvValue::Other {
                    tag: TlvTag::Other(other),
                    value,
                })?
            }
        };

        Ok((value, size))
    }
}