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
/*
*
* Copyright (c) 2024 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//! TLV support for Rust slices `&[T]`.
//! Rust slices are serialized as TLV arrays.
//!
//! Note that only serialization `(trait `ToTLV`) is supported for Rust slices,
//! because deserialization (`FromTLV`) requires the deserialized Rust type
//! to be `Sized`, which slices aren't.
//!
//! (Deserializing strings as `&str` and octets as `Bytes<'a>` (which is really a newtype over
//! `&'a [u8]`) is supported, but that's because their deserialization works by borrowing their
//! content 1:1 from inside the byte slice of the `TLVElement`, which is not possible for a generic
//! `T` and only possible when `T` is a `u8`.)
use crateError;
use ;
/// This type alias is necessary, because `FromTLV` / `ToTLV` do not (yet) support
/// members that are slices.
///
/// Therefore, use `Slice<'a, T>` instead of `&'a [T]` as a syntax in your structs.
pub type Slice<'a, T> = &'a ;
// TODO: Uncomment once `feature(impl_trait_in_assoc_type)` is stable
// pub struct IntoTLVIter<'a, T>(pub &'a TLVTag, pub T);
// impl<'a, T> IntoIterator for IntoTLVIter<'a, &'a [T]>
// where
// T: ToTLV + 'a,
// {
// type Item = Result<TLV<'a>, Error>;
// type IntoIter = impl Iterator<Item = Self::Item>;
// fn into_iter(self) -> Self::IntoIter {
// tlv_array_iter(self.0.clone(), self.1.iter())
// }
// }
pub
pub
pub + 's
where
I: + 's,
T: ToTLV + 's,