1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
5 use super::{ZeroSlice, ZeroVec}
;
10 use core
::marker
::PhantomData
;
12 use serde
::de
::{self, Deserialize, Deserializer, SeqAccess, Visitor}
;
13 #[cfg(feature = "serde")]
14 use serde
::ser
::{Serialize, SerializeSeq, Serializer}
;
16 struct ZeroVecVisitor
<T
> {
17 marker
: PhantomData
<fn() -> T
>,
20 impl<T
> Default
for ZeroVecVisitor
<T
> {
21 fn default() -> Self {
28 impl<'de
, T
> Visitor
<'de
> for ZeroVecVisitor
<T
>
30 T
: 'de
+ Deserialize
<'de
> + AsULE
,
32 type Value
= ZeroVec
<'de
, T
>;
34 fn expecting(&self, formatter
: &mut fmt
::Formatter
) -> fmt
::Result
{
35 formatter
.write_str("a sequence or borrowed buffer of fixed-width elements")
38 fn visit_borrowed_bytes
<E
>(self, bytes
: &'de
[u8]) -> Result
<Self::Value
, E
>
42 ZeroVec
::parse_byte_slice(bytes
).map_err(de
::Error
::custom
)
45 fn visit_seq
<A
>(self, mut seq
: A
) -> Result
<Self::Value
, A
::Error
>
49 let mut vec
: Vec
<T
::ULE
> = if let Some(capacity
) = seq
.size_hint() {
50 Vec
::with_capacity(capacity
)
54 while let Some(value
) = seq
.next_element
::<T
>()?
{
55 vec
.push(T
::to_unaligned(value
));
57 Ok(ZeroVec
::new_owned(vec
))
61 /// This impl can be made available by enabling the optional `serde` feature of the `zerovec` crate
62 impl<'de
, 'a
, T
> Deserialize
<'de
> for ZeroVec
<'a
, T
>
64 T
: 'de
+ Deserialize
<'de
> + AsULE
,
67 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
71 let visitor
= ZeroVecVisitor
::default();
72 if deserializer
.is_human_readable() {
73 deserializer
.deserialize_seq(visitor
)
75 deserializer
.deserialize_bytes(visitor
)
80 /// This impl can be made available by enabling the optional `serde` feature of the `zerovec` crate
81 impl<T
> Serialize
for ZeroVec
<'_
, T
>
85 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
89 if serializer
.is_human_readable() {
90 let mut seq
= serializer
.serialize_seq(Some(self.len()))?
;
91 for value
in self.iter() {
92 seq
.serialize_element(&value
)?
;
96 serializer
.serialize_bytes(self.as_bytes())
101 /// This impl can be made available by enabling the optional `serde` feature of the `zerovec` crate
102 impl<'de
, T
> Deserialize
<'de
> for Box
<ZeroSlice
<T
>>
104 T
: Deserialize
<'de
> + AsULE
+ '
static,
106 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
108 D
: Deserializer
<'de
>,
110 let mut zv
= ZeroVec
::<T
>::deserialize(deserializer
)?
;
111 let vec
= zv
.with_mut(mem
::take
);
112 Ok(ZeroSlice
::from_boxed_slice(vec
.into_boxed_slice()))
116 /// This impl can be made available by enabling the optional `serde` feature of the `zerovec` crate
117 impl<'de
, 'a
, T
> Deserialize
<'de
> for &'a ZeroSlice
<T
>
119 T
: Deserialize
<'de
> + AsULE
+ '
static,
122 fn deserialize
<D
>(deserializer
: D
) -> Result
<Self, D
::Error
>
124 D
: Deserializer
<'de
>,
126 if deserializer
.is_human_readable() {
127 Err(de
::Error
::custom(
128 "&ZeroSlice cannot be deserialized from human-readable formats",
131 let deserialized
: ZeroVec
<'a
, T
> = ZeroVec
::deserialize(deserializer
)?
;
132 let borrowed
= if let Some(b
) = deserialized
.as_maybe_borrowed() {
135 return Err(de
::Error
::custom(
136 "&ZeroSlice can only deserialize in zero-copy ways",
144 /// This impl can be made available by enabling the optional `serde` feature of the `zerovec` crate
145 impl<T
> Serialize
for ZeroSlice
<T
>
147 T
: Serialize
+ AsULE
,
149 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
153 self.as_zerovec().serialize(serializer
)
158 #[allow(non_camel_case_types)]
160 use crate::samples
::*;
163 #[derive(serde::Serialize, serde::Deserialize)]
164 struct DeriveTest_ZeroVec
<'data
> {
166 _data
: ZeroVec
<'data
, u16>,
170 fn test_serde_json() {
171 let zerovec_orig
= ZeroVec
::from_slice_or_alloc(TEST_SLICE
);
172 let json_str
= serde_json
::to_string(&zerovec_orig
).expect("serialize");
173 assert_eq
!(JSON_STR
, json_str
);
174 // ZeroVec should deserialize from JSON to either Vec or ZeroVec
175 let vec_new
: Vec
<u32> =
176 serde_json
::from_str(&json_str
).expect("deserialize from buffer to Vec");
179 ZeroVec
::<u32>::from_slice_or_alloc(vec_new
.as_slice())
181 let zerovec_new
: ZeroVec
<u32> =
182 serde_json
::from_str(&json_str
).expect("deserialize from buffer to ZeroVec");
183 assert_eq
!(zerovec_orig
, zerovec_new
);
184 assert
!(zerovec_new
.is_owned());
188 fn test_serde_bincode() {
189 let zerovec_orig
= ZeroVec
::from_slice_or_alloc(TEST_SLICE
);
190 let bincode_buf
= bincode
::serialize(&zerovec_orig
).expect("serialize");
191 assert_eq
!(BINCODE_BUF
, bincode_buf
);
192 // ZeroVec should deserialize from Bincode to ZeroVec but not Vec
193 bincode
::deserialize
::<Vec
<u32>>(&bincode_buf
).expect_err("deserialize from buffer to Vec");
194 let zerovec_new
: ZeroVec
<u32> =
195 bincode
::deserialize(&bincode_buf
).expect("deserialize from buffer to ZeroVec");
196 assert_eq
!(zerovec_orig
, zerovec_new
);
198 assert
!(!zerovec_new
.is_owned());
202 fn test_chars_valid() {
203 // 1-byte, 2-byte, 3-byte, and 4-byte character in UTF-8 (not as relevant in UTF-32)
204 let zerovec_orig
= ZeroVec
::alloc_from_slice(&['w'
, 'ω'
, '文'
, '𑄃'
]);
205 let bincode_buf
= bincode
::serialize(&zerovec_orig
).expect("serialize");
206 let zerovec_new
: ZeroVec
<char> =
207 bincode
::deserialize(&bincode_buf
).expect("deserialize from buffer to ZeroVec");
208 assert_eq
!(zerovec_orig
, zerovec_new
);
210 assert
!(!zerovec_new
.is_owned());
214 fn test_chars_invalid() {
215 // 119 and 120 are valid, but not 0xD800 (high surrogate)
216 let zerovec_orig
: ZeroVec
<u32> = ZeroVec
::from_slice_or_alloc(&[119, 0xD800, 120]);
217 let bincode_buf
= bincode
::serialize(&zerovec_orig
).expect("serialize");
218 let zerovec_result
= bincode
::deserialize
::<ZeroVec
<char>>(&bincode_buf
);
219 assert
!(matches
!(zerovec_result
, Err(_
)));